c++一个线程里面new的内存到另一个线程去释放,为什么会出错

撸红薯 发布于 2013/06/03 09:44
阅读 3K+
收藏 0
c++一个线程里面new的内存到另一个线程去释放,为什么会出错
加载中
0
明月惊鹊
明月惊鹊

一般用new不会出错的,如果是微软的COM对象就不同。

检查你的代码吧。看看是不是溢出了?

0
明月惊鹊
明月惊鹊

常见的一种错误是这样:

p = new int [n]; //分配好内存;

*p = xx; //赋值(使用);

p++;

....


delete p; //p已经移动了,已经不是原始的指针,所以释放会出错。

明月惊鹊
明月惊鹊
日x,又打漏了一个 *号
明月惊鹊
明月惊鹊
回复 @ren谈 : 事先要准备多一个指针来指向首地址。 比如 char *p1, p2; p1 = new char[n]; p2 = p1; p2++; delete []p1; //p1一直都不能改变。
nullptr
nullptr
你的这个那应该怎么释放?只能让他自动回收了?
明月惊鹊
明月惊鹊
delete [ ] p;
0
a
autocoder
最好遵循谁分配 谁释放原则.
0
hejinyouyu
hejinyouyu

用智能指针吧……

不然你的“另外一个线程”说不定先把你的内存给释放了。

0
云松
云松
我建议多写一成函数封装 new和delete,用log打印出new 和 delete的地方。 最好加上计数器~  即 new 次+1  delete -1, 不过 最好的办法还是 使用打印出log ~  看看 第一释放在哪里。  
0
青萍之末
青萍之末
这还用想,必然是你用错了
0
撸红薯
撸红薯

引用来自“明月惊鹊”的答案

一般用new不会出错的,如果是微软的COM对象就不同。

检查你的代码吧。看看是不是溢出了?

这是一道面试题考察的是私有堆的问题
0
撸红薯
撸红薯

引用来自“cbh”的答案

这还用想,必然是你用错了
这是一道面试题考察的是私有堆的问题
0
撸红薯
撸红薯

引用来自“云松”的答案

我建议多写一成函数封装 new和delete,用log打印出new 和 delete的地方。 最好加上计数器~  即 new 次+1  delete -1, 不过 最好的办法还是 使用打印出log ~  看看 第一释放在哪里。  
这是一道面试题
0
甘薯
甘薯
还是上代码吧,按说这个问题不应该出现的。
返回顶部
顶部