栈空间不足导致out of memory

idInfo.baseMat = readMat(baseFile, rmc, rmr);
idInfo.meanMat = readMat(meanFile, mmc, mmr);
idInfo.referMat = readMat(trainFile, tmc, tmr);

CvMat *readMat(char *filePath, int width, int height) {  assert(NULL != filePath);  assert(width*height > 0);

 CvMat *Mat = cvCreateMat(height, width, CV_32FC1);  FILE *fp = fopen(filePath, "rb");  for(int i=0; i<height; i++)  {   unsigned char *p = Mat->data.ptr + i*width;   int r = fread(p, sizeof(double)*width, 1, fp);   if(r != 1) perror("");  }  fclose(fp);

 return Mat; }

在连续三次读取比较大的矩阵的时候,执行第三个readMat函数出现了错误,经过调试发现是cvCreateMat()函数out of memory并且是堆栈错误,当注释掉前两个readMat函数后,错误不再出现,据初步分析,可能是栈空间不足引起的。或者改为如下代码,使其在堆上分配空间也可以。

static CvMat *baseMat = cvCreateMat(rmr, rmc, CV_32FC1);
static CvMat *meanMat = cvCreateMat(mmr, mmc, CV_32FC1);
static CvMat *trainMat = cvCreateMat(tmr, tmc, CV_32FC1);


由此可以看出cvCreateMat应该是在栈上分配空间?

C++程序运行时报错“out of memory”通常意味着程序试图分配比系统可用内存更多的内存。这种错误可能由多种原因引起,以下是一些常见的原因及解决方法: 1. **内存泄漏**: - 程序中分配的内存没有被正确释放,导致内存逐渐耗尽。 - **解决方法**:使用智能指针(如`std::unique_ptr`或`std::shared_ptr`)来管理动态分配的内存,确保在不需要时自动释放。 2. **过度分配**: - 程序在短时间内分配了大量内存,超出了系统内存限制。 - **解决方法**:优化代码,减少不必要的内存分配,使用内存池等技术来管理内存。 3. **大对象分配**: - 程序试图分配一个非常大的对象,超出了系统的内存限制。 - **解决方法**:检查代码,确保没有不必要的对象分配,尽量使用更小的数据类型或分批处理数据。 4. **递归深度过大**: - 程序中的递归调用过深,导致栈空间耗尽。 - **解决方法**:优化递归算法,使用迭代方法替代递归,或者增加栈空间(如果可能)。 5. **系统内存不足**: - 系统内存不足,无法满足程序的内存需求。 - **解决方法**:关闭其他占用大量内存的程序,或者增加系统内存。 6. **内存碎片**: - 系统内存中存在大量碎片,导致无法分配连续的连续内存。 - **解决方法**:使用内存池或自定义内存分配器,减少内存碎片。 以下是一个简单的示例,展示了如何使用智能指针来管理动态内存,避免内存泄漏: ```cpp #include <iostream> #include <memory> class MyClass { public: MyClass() { std::cout << "MyClass constructor" << std::endl; } ~MyClass() { std::cout << "MyClass destructor" << std::endl; } }; int main() { std::unique_ptr<MyClass> ptr = std::make_unique<MyClass>(); // 不需要手动释放内存,智能指针会自动处理 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值