"delete"在 C++ 中实际上做了什么?
What does "delete" actually do in c++?
我不确定delete
命令在 c++ 中到底做了什么?据我所知,要释放内存,我必须在对象上使用delete
,我之前用new
实例化,例如:
Obj* object = new Obj();
delete object;
但是delete
是否实际上从我的对象中删除了数据,它是否以任何方式更改了对象和对象本身中的数据,或者它只是调用相应的析构函数?如果析构函数为空,使用delete
是否会对对象产生任何后果?这个问题的原因如下:
如果我只是以这种方式删除对象,指针将失效,并且我的程序确实崩溃。所以,我认为我应该使用 delete 命令调用析构函数,并在析构函数中采取进一步的步骤,实际执行清理并确保引用此对象的其他对象知道指针确实无效。
除了调用析构函数之外,delete
运算符还会解除分配以前由new
分配的内存。 此内存返回到可分配的可用内存池。
这也意味着object
现在指向无效内存,任何使用它的尝试,或任何其他指向它的指针,都将调用未定义的行为。 这可能是您的程序中正在发生的情况。
因此,您的程序很可能与谁"拥有"指针存在问题。 不应在程序中其他位置仍在使用的指针值上调用delete
。
相关文章:
- "delete"在 C++ 中实际上做了什么?
- C++"::delete"的目的是什么?
- 将复制构造函数设置为private和=delete有什么区别
- 运算符 delete[] 有什么作用?
- 在 C++ 中,这两种"pointer delete"操作有什么区别?
- 如果在删除后使用 delete[] 会发生什么?
- 我们什么时候应该在 C++ 中将析构函数声明为 =DELETE
- 在C++中,对象什么时候真正被销毁?delete(ptr)做什么
- C++中的大小释放:全局运算符delete的正确行为是什么(void*ptr,std::size_t size)
- [](int* p){delete p;} 是什么意思
- 堆栈对象"delete"的行为是什么?
- new/delete 和 ::new/::d elete 有什么区别?
- 我什么时候应该在C++中重载new/delete
- 在游戏引擎中重载"new"和"delete"进行自定义内存分配有什么好处?
- 当我们在指向未分配 new 运算符的对象的指针上使用 delete 时会发生什么
- 如果将 delete[] 应用于非数组指针会发生什么情况
- 在给定的 c++ 代码中"delete [] element"以实现一维数组的目的是什么?
- 什么是"::operator new"和"::operator delete"?
- 当调用 delete[] X 命令时,到底发生了什么以及谁负责
- 当我在 C++ 中对未初始化的指针调用"delete"时会发生什么情况?