使用 mxArray C++动态内存分配
C++ dynamic memory allocation with mxArray
这就是我想要实现的目标:
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->road
是std::map<std::string, double>
,this->roadFields
是包含 .mat 文件中 ROAD 结构的所有字段名称的std::vector<std::string>
。
我在mxGetPr
调用中收到访问冲突,我想这是因为返回的数组具有不同的长度?我想我需要以某种方式重新分配内存,但我一直无法弄清楚如何。
mxGetFieldByNumber()
为某些错误返回NULL。 由于您的段错误发生在 mxGetPr()
上,这表明您正在传递非法的东西,并且非法的东西可能是 NULL。
此函数的文档指出,导致 NULL 返回的常见错误是:
- 指定不指向结构 mxArray 的数组指针 pm。调用 mxIsStruct 以确定 pm 是否指向结构 mxArray。
- 指定指向 mxArray 边界之外的元素的索引。例如,给定一个包含十个元素的结构 mxArray,不能在 C 中指定大于 9(在 Fortran 中指定大于 10 的索引)。
- 指定不存在的字段编号。调用 mxGetFieldNumber 以确定与给定字段名称对应的字段编号。
检查 mxGetFieldByNumber()
的返回值,如果确实为 NULL,请浏览上面的列表并检查您的输入条件。
我解决了。问题的一部分是一个愚蠢的错误,即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);
感谢所有的帮助。
相关文章:
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配