使用mxArray进行C ++动态内存分配

时间:2013-12-19 15:28:01

标签: c++ matlab memory-management

这就是我想要实现的目标:

MATFile *file = matOpen(this->filename.c_str(),"r");
mxArray *roadstruct = matGetVariable(file, "ROAD");
mxArray *field;
int i;
for (i = 0; i < this->roadFields.size(); i++) {
field = mxGetFieldByNumber(roadstruct,0,i);
if(field != NULL) {
this->road[this->roadFields.at(i).c_str()] = *mxGetPr(field);
}
}

其中this->roadstd::map<std::string, double>,而this->roadFieldsstd::vector<std::string>,其中包含.mat文件中ROAD结构的所有字段名称。

我在mxGetPr调用中遇到访问冲突,我想这是因为返回的数组有不同的长度?我想我需要以某种方式重新分配内存,但我无法弄清楚如何。

2 个答案:

答案 0 :(得分:2)

对于某些错误,

mxGetFieldByNumber()返回NULL。由于你的段错误发生在mxGetPr()上,它表明你传递的东西是非法的,非法的东西可能是NULL。

此函数的documentation表示导致NULL返回的常见错误是:

  • 指定不指向结构mxArray的数组指针pm。调用mxIsStruct以确定pm是否指向结构mxArray。
  • 指定mxArray范围之外的元素的索引。例如,给定包含十个元素的结构mxArray,您不能在C中指定大于9的索引(Fortran中为10)。
  • 指定不存在的字段编号。调用mxGetFieldNumber以确定与给定字段名称对应的字段编号。

检查mxGetFieldByNumber()的返回值,如果确实为NULL,请查看上面的列表并检查输入条件。

答案 1 :(得分:0)

我解决了。部分问题是一个愚蠢的错误,std::vector<std::string>中的几个字段名称与ROAD结构中的字段名称不完全匹配。但我也不得不使用memcpy(现在看来很明显)。

for循环的内容现在看起来像这样,它可以工作!

size_t arraySize = mxGetNumberOfElements(field)*sizeof(double);
this->road[this->roadFields.at(i).c_str()] = (double*) malloc(arraySize);
memcpy(this->road[this->roadFields.at(i).c_str()],mxGetPr(field),arraySize);

感谢所有帮助。