使用placement new后释放内存的C++技术疑问
使用placement new后释放内存的C++技术疑问
哥们,你的问题问到点子上了——placement new确实是C++里内存管理比较容易搞混的点,我来给你掰扯清楚:
首先得明确placement new的核心逻辑:它根本不负责内存分配,只是帮你在已经分配好的内存地址上调用对象的构造函数。所以内存的分配和释放完全是你的事儿,跟placement new本身没关系。
先看你的代码:
class display{ public: display(int b){ std::cout<<"the value of a: "<<b; } }; char *memory= new char[sizeof(display)]; // 这里是用普通new[]分配的内存 display *obj; int main(){ int a=69; obj=new(memory) display(a); // placement new只是在memory的地址上构造对象 return 0; }
现在针对你的疑问:能不能delete memory?分两种情况说:
1. 你需要保留这个对象全程使用(也就是你说的全局用在回调里)
这种情况下绝对不能delete memory,也不能调用对象的析构函数。
- 如果你delete memory,相当于把这块内存还给操作系统了,但你的obj指针还指着这块已经被释放的空间,之后再访问obj的话,就是踩野指针,轻则数据错乱,重则直接崩溃。
- 因为你要一直用这个对象,所以这块内存必须一直被占用着。等程序退出的时候,操作系统会自动回收进程的所有内存,所以不用担心所谓的“内存泄漏”——实际运行中不会有残留问题,只是严格从C++标准看属于“泄漏”,但对程序运行没影响。
2. 某个时刻你不再需要这个对象了
这时候要按正确的顺序来:
- 第一步:手动调用对象的析构函数,因为placement new不会自动帮你做这件事:
obj->~display(); - 第二步:释放你当初用new[]分配的内存,注意要用
delete[] memory;(因为你是用new char[]分配的数组内存,必须匹配delete[],不能用普通delete)
最后再给你划个重点:placement new只是“借”你提供的内存来构造对象,内存的所有权自始至终都是你的,所以什么时候释放内存,完全取决于你对这个对象的生命周期需求——只要对象还活着,内存就不能碰;对象死了,记得先收尸(调用析构)再还内存。
备注:内容来源于stack exchange,提问作者Some random guy
相关产品推荐
相关产品推荐

