删除命令会清除用新分配的内存吗?

时间:2015-04-15 13:04:32

标签: c++

我试图理解删除如何清除为对象分配的内存。 有人可以清楚解释一下吗?

我做这样的事情:

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";
}

4 个答案:

答案 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或稍后可用于标识清除的位模式)以帮助调试。

这样,访问已删除的对象很可能会在早期产生访问冲突,而不是无声地失败。

在发布版本中,除了被调用的(伪)析构函数之外,没有其他任何事情发生。

请注意,在NULLdelete之后设置指向free的指针是代码气味,因为它可以掩盖一些错误。

答案 3 :(得分:0)

  

我试图理解删除如何清除为对象分配的内存。任何人都可以说清楚吗?

delete删除执行以下操作:

  • 查看收到的地址,并将其解释为指针(指针类型指定的数据)

  • 为所有数据实例调用析构函数,为收到地址的对象调用

  • 告诉内部内存分配子系统,接收指针中的地址现在是空闲的。这将释放内存到操作系统(以便其他应用程序可以使用它)或(更有可能)在内部缓存它并将其用于后续分配(使用newnew[]执行下一次分配相同或更小的尺寸可能会收到此指针)。

这些是在C ++中解除分配堆数据的最小步骤。

您会注意到该列表中没有任何地方是指向null / zero / speciffic值&#34;的指针。这是因为有些情况下指针的值在删除语句之后没有意义(例如,在析构函数体内),并且将其设置为零只会浪费处理器周期。

根据经验,在C ++代码编写时,您不需要为不使用的内容付费。如果您已经使用了这样的功能,那么自己编写它是很简单的(这个例子不适用于数组):

template<typename T>
void safe_delete(T*& ptr) // use instead of delete
{
    delete ptr;
    ptr = nullptr;
}