我试图理解删除如何清除为对象分配的内存。 有人可以清楚解释一下吗?
我做这样的事情:
class MyClass{
public :
MyClass() {std::cout <<" constructed\n";}
~MyClass() {std::cout <<" destroyed\n";}
};
int main ()
{
MyClass * pt=NULL;
pt = new MyClass();
delete pt;
if ( pt == NULL )
std::cout<<"deallocated\n";
}
答案 0 :(得分:11)
delete pt
将调用析构函数 ~MyClass()
,然后将对象*pt
占用的所有内存释放回操作系统。
不所做的是改变指针的值,因为这是不必要的。
一些程序员会在pt = nullptr
之后设置delete
,因为C ++标准保证delete nullptr
是无操作。所以它可以帮助程序稳定。
答案 1 :(得分:2)
delete p
确实释放了p
值所指向的对象占用的存储空间等。
但不修改p
的值。这没有意义。考虑一下:
int * funky_ptr();
delete funky_ptr();
这里delete
的操作数是prvalue;修改它会有什么意义?
答案 2 :(得分:2)
取决于。
在调试版本中,一些编译器通常会清除内存(将所有内容设置为0
或稍后可用于标识清除的位模式)以帮助调试。
这样,访问已删除的对象很可能会在早期产生访问冲突,而不是无声地失败。
在发布版本中,除了被调用的(伪)析构函数之外,没有其他任何事情发生。
请注意,在NULL
或delete
之后设置指向free
的指针是代码气味,因为它可以掩盖一些错误。
答案 3 :(得分:0)
我试图理解删除如何清除为对象分配的内存。任何人都可以说清楚吗?
delete
删除执行以下操作:
查看收到的地址,并将其解释为指针(指针类型指定的数据)
为所有数据实例调用析构函数,为收到地址的对象调用
告诉内部内存分配子系统,接收指针中的地址现在是空闲的。这将释放内存到操作系统(以便其他应用程序可以使用它)或(更有可能)在内部缓存它并将其用于后续分配(使用new
或new[]
执行下一次分配相同或更小的尺寸可能会收到此指针)。
这些是在C ++中解除分配堆数据的最小步骤。
您会注意到该列表中没有任何地方是指向null / zero / speciffic值&#34;的指针。这是因为有些情况下指针的值在删除语句之后没有意义(例如,在析构函数体内),并且将其设置为零只会浪费处理器周期。
根据经验,在C ++代码编写时,您不需要为不使用的内容付费。如果您已经使用了这样的功能,那么自己编写它是很简单的(这个例子不适用于数组):
template<typename T>
void safe_delete(T*& ptr) // use instead of delete
{
delete ptr;
ptr = nullptr;
}