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

时间:2011-01-15 06:03:24

标签: 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?
    }

};

2 个答案:

答案 0 :(得分:7)

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

Sample()
{
    bits = NULL;
}

您是否需要此分配取决于您的代码 - 如果bits可能根本没有分配任何内存,那么NULL分配应该在那里,因为{{1}在析构函数中。实际上作为一个安全问题,您可能需要delete,除非您记录用户必须遵守的一些合同,但是在这里,因为您正在初始化指向NULL的指针,我将假设这意味着{{ 1}}实际上可能是NULL或实际上有bits - 在某个时刻分配了内存。

如果你没有初始化指针,并且之后永远不会因为被赋予某些东西而变得“有效”,并且对象被破坏,那么就会发生不好的事情。

另外,作为习惯,prefer to use initialization lists在构造函数中尽可能:

NULL

对于析构函数,在删除指针之前,不需要检查指针是否不是newSample() : bits(NULL) { } 指针上的NULL是完全安全的。您也无需将delete指针重新分配回NULL,对象即将消失。

bits

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

答案 1 :(得分:2)

class Sample
{

private:
    char *bits;

public:

    Sample() : bits(NULL) //always use member initialization list to init members
    {      
    }


    ~Sample() 
    {   
           delete [] bits; 
    }

};