C++:在new/delete上分配和检查NULL

dev*_*ull 1 c++

是否在下面的代码段中明确要求赋值和检查null以获得相同的结果.此外,这里有什么不对或可以改进.

class Sample
{

private:
    char *bits;

public:

    Sample() 
    {
       bits = NULL; //should this be explicit?
    }


    ~Sample() 
    {
        if (bits != NULL) 
        {
           delete [] bits; //should this be explicit?
        }
        bits = NULL; //should this be explicit?
    }

};
Run Code Online (Sandbox Code Playgroud)

wkl*_*wkl 7

在第一种情况下,您在构造函数中执行此操作:

Sample()
{
    bits = NULL;
}
Run Code Online (Sandbox Code Playgroud)

您是否需要此分配取决于您的代码 - 如果bits根本没有分配任何内存,则NULL由于delete析构函数中的分配应该在那里.实际上作为一个安全问题,你可能想要NULL除非你记录用户必须遵守的一些合同,但是在这里,因为你正在初始化指针NULL,我将假设在某些方面bits可以实际上NULL或实际上已经new分配了内存.

如果你没有初始化指针,并且它永远不会被分配的东西变得"有效",并且对象被破坏,那么就会发生坏事.

另外,作为习惯,在构造函数中尽可能使用初始化列表:

Sample() 
    : bits(NULL)
{

}
Run Code Online (Sandbox Code Playgroud)

对于析构函数,NULL在删除指针之前不需要检查指针是否存在.deleteNULL指针上是完全安全的.您也不需要将bits指针重新分配回来NULL,对象就会消失.

~Sample()
{
    delete [] bits;
}
Run Code Online (Sandbox Code Playgroud)

当然,如果你delete指针无效,那么无论如何都会发生不好的事情.

  • 一般经验法则:如果在new中使用[],请在删除时使用[] (2认同)