使用 MATLAB mex 将向量与另一个向量分配时出现分段错误

Posted

技术标签:

【中文标题】使用 MATLAB mex 将向量与另一个向量分配时出现分段错误【英文标题】:Segmentation fault when assigning vector with another vector using MATLAB mex 【发布时间】:2014-09-23 16:51:25 【问题描述】:

这是执行过程中出现错误的地方:

C[check].S = vector<int>(S1);

end C 是一个全局结构数组,定义为:

typedef struct C_type
    double e;
    vector <int> S;
Cache;
Cache *C;

现在这个问题有时会出现分段错误错误,所以有什么提示可以解决这个问题吗? (S1 不为空,S[check].S 始终为空)。

【问题讨论】:

你不能只声明一个指针并期望它创建实际的对象...new. 嗨,我用 C = (Cache )malloc(sizeof(Cache)*KT*T); 初始化缓存 @chappjc 所以我应该用 new 初始化每个元素?谢谢 因为这是 C++,我会使用Cache *C = new Cache[K*T*T];(完成后不要忘记delete[] Cvector&lt;int&gt; S 需要在每个 Cache 时初始化已创建,所以我会use new。还可以查看struct in C++ 上的这篇文章,这可能会通过删除typedef 来简化您的结构定义。 谢谢,我以前用过 malloc() 和 free(),我猜原因是 malloc 没有考虑每个元素内部的动态内存消耗,所以可能存在问题。现在我改回 new() 并删除 [] C. 【参考方案1】:

由于这是 C++,请使用 Cache *C = new Cache[K*T*T];vector&lt;int&gt; S需要在每个Cache创建的时候初始化,所以use new to accomplish this。 malloc 唯一做的就是分配字节块,但不初始化内容。

完成后别忘了delete[] C

还可以查看this post on struct in C++,,它可能会通过删除typedef 来简化您的结构定义。

【讨论】:

@Coderzelf 我很高兴它有帮助。关于new 的重要一点是每个元素都会运行它的构造函数。在这种情况下,它只是初始化每个成员(对于向量成员来说并不重要)。如果您愿意,也可以随意投票! :)

以上是关于使用 MATLAB mex 将向量与另一个向量分配时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

MEX 文件中 Matlab 矩阵的线性索引

在 MATLAB mexFunction 中,如何将 GNU 科学库矩阵和向量分配给 plhs?

如何在Mexfile中的matlab(矩阵,单元格)和c ++(向量或自定义类)之间正确转换变量

如何找到将 X、Y、Z 向量与另一个坐标系对齐的角度

如何在 mex 结构中设置向量元素

向量范围构造函数与另一个向量的更新数据