与 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 终止的字符串
std::string 生成链接器错误—— const char* 不会。为啥?