与 libmx 链接并使用 std::stringstream 时出现 g++ malloc 错误

Posted

技术标签:

【中文标题】与 libmx 链接并使用 std::stringstream 时出现 g++ malloc 错误【英文标题】:g++ malloc error when linking with libmx and using std::stringstream 【发布时间】:2014-10-24 21:30:42 【问题描述】:

最简单的示例是以下程序,在 OS X Yosemite 上与 libmx (-lmx)(用于 MATLAB 支持)链接,使用来自 macports 的 g++4.9.1 编译:

#include <sstream>

int main()

    std::ostringstream ostr;
    // ostr << " "; // if I un-comment this line no more malloc error

我意识到在ostr 销毁(就在退出程序之前),我收到了以下形式的 malloc 运行时错误:

testcpp(5362,0x7fff7d2af300) malloc: *** error for object 0x1055b6270: 
pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug

另一方面,如果我取消注释main() 中的第二行并向ostringstream 写入一些内容,那么程序将愉快地退出,不再出现错误。这只发生在 g++ 中,clang++ 编译并运行它没有任何问题。任何人都知道这是g++ 相关问题还是libmx 问题?

PS:如果我没有在链接时使用-lmx 标志,那么就不会再出现malloc 错误了。

【问题讨论】:

多么奇怪.. 这可能无关紧要,但你为什么要在一个不包含任何 Matlab 库且没有 mexFunction 的文件中链接到 libmx ?您能否尝试包括mex.h,并将其放在您的主要检查void mexFunction( int nargout, mxArray *out[], int nargin, const mxArray *in[] ) main(); 之后? 不不,我在我的程序中包含了它们,但这只是出现错误的最小示例。我正在使用它将特征矩阵保存为 MATLAB 格式,并能够从 .mat 文件中加载它们。完整的源代码(在这里发布的方式很大)在 github.com/vsoftco/qpp 上,我使用 MATLAB 函数的文件是 github.com/vsoftco/qpp/blob/master/include/matlab.h 每当我在 github.com/vsoftco/qpp/blob/master/include/io.h 中使用名为 disp 的函数时,就会出现错误,其中ostringstream 用于格式化 @Sh3ljohn 你能重现这个错误吗? 所以,不,但是因为我无法链接到-lmx。我从here 安装了MCR,并与-L/path/to/runtime/glnxa64 链接(我在Linux 上),是否等效? @Sh3ljohn,谢谢,我不确定,会尝试让您知道。我使用了 MATLAB (R2014b) 安装中的 libmx。 【参考方案1】:

我想最好单独评论一下。正如我所说,我在重现您的错误时遇到了麻烦。我在 Ubuntu Linux 14.04 64 位和 g++ 4.8.2 上,我下载了用于 Linux 64 位的 Matlab Compiler Runtime v83 和 v84。

我正在编译的源码如下:

#include <sstream>

int main()

    std::ostringstream ostr;
    // ostr << " "; // if I un-comment this line no more malloc error

以下命令运行良好(2014 a 和 b):

g++ -L/opt/MATLAB/MCR/v83/runtime/glnxa64 -Wall malloc_gcc_matlab.cpp -o malloc_gcc_matlab && ./malloc_gcc_matlab
g++ -L/opt/MATLAB/MCR/v84/runtime/glnxa64 -Wall malloc_gcc_matlab.cpp -o malloc_gcc_matlab && ./malloc_gcc_matlab

【讨论】:

好的,非常感谢,它可能是 OS X/g++/libmx 之间的组合产生了错误。它也只出现在 R2014b 中。我的猜测是它与 g++(我有 g++4.9.1)有关,因为 clang++ 运行良好。 我认为这是 OSX 上的 gcc 与 clang 问题(很可能与 libstdc++ 与 libc++ 有关)。值得一提的是,受支持的编译器是 Apple 的 Xcode,因此如果您想使用 GCC,可能需要更改 MEX 编译选项:mathworks.com/support/compilers/R2014b/index.html?sec=maci64 @Amro,谢谢!有点遗憾,因为clang++还不支持openmp

以上是关于与 libmx 链接并使用 std::stringstream 时出现 g++ malloc 错误的主要内容,如果未能解决你的问题,请参考以下文章

将 std::string_view 与 api 一起使用,期望以 null 终止的字符串

将 std::string_view 与 api 一起使用,期望以 null 终止的字符串

C++ 性能挑战:整数到 std::string 的转换

std::string 生成链接器错误—— const char* 不会。为啥?

由于未定义对具有 std::string 的方法的引用,链接 webrtc-native 时出错

如何干净地使用:const char* 和 std::string?