关于C++重载类的运算符后的内存膨胀有关问题,尤其是友元函数
关于C++重载类的运算符后的内存膨胀问题,尤其是友元函数Matrix operator +(Matrix &b,double a){//加法重
关于C++重载类的运算符后的内存膨胀问题,尤其是友元函数
Matrix operator +(Matrix &b,double a){//加法重载函数
Matrix c;
c.row=b.row;
c.col=b.col;
c.p=new double[c.col*c.row];
int i,j;
for(i=0;i<c.col;i++)
{
for(j=0;j<c.row;j++)
{
c.p[j*c.col+i]=a + b.p[j*c.col+i];
}
}
return c;
}
输入命令:
Matrix a(1000,10);Matrix b(1000,10);a=b+3;
你会发现堆栈是160000bytes,但是内存却涨了240000bytes。
再进行处理a=a+b;
堆栈还是160000bytes,但是一看任务管理器,内存又涨了!
请问怎么才能清除这些奇怪的内存数据?
[解决办法]
很明显应该
delete[] this->p;
你写成delete this->p;
肯定泄露一大片!!!!!!!!!!!!!!!!!!!
[解决办法]
那其实只是你人品好。但是,一个人不可能一直人品好。
[解决办法]c++ 标准只要求 delete[] 析构对象并释放内存,但释放内存并不等于任务管理器里显示的内存数据就会相应的下降。因为,windows 完全可以采用 lazy 模式,预期你的程序还可能再次分配内存,并且系统当前没有其他内存需要导致不得不真正释放掉你已经 delete 掉的内存,这样做是为了在你程序下次申请内存的时候,能够进行快速反应,实际上是系统的一种优化机制。所以你释放的内存还算在你程序的头上,只不过这只是对 windows 而言,对 c++ 来说,这部分内存已经不存在了。其实,很多 undefined behavior 的道理和你这个例子一样,都是内存已经释放掉了,只不过系统没有迫切需求立即回收而已,导致也看起来已经逝去的东西貌似还存在。
[解决办法]有没有内存泄露,随便拿个工具检测一下不就行了,有必要这样吗?
我弄了半天,你这个程序根本就没有内存泄露,至于a=a+b,由于这个加法运算符没有贴出来,不知道你这个有内存泄露没有,a=b+3;肯定没有内存泄露,下面是测试的:
Visual Leak Detector Version 1.0 installed (multithreaded DLL).
No memory leaks detected.
“test5.exe”: 已卸载“C:\Windows\System32\dbghelp.dll”
Visual Leak Detector is now exiting.