C++ C++;:赋值和检查新建/删除时是否为空

C++ C++;:赋值和检查新建/删除时是否为空,c++,C++,在下面的代码段中,为了获得相同的结果,显式需要赋值并检查null。还有,这里有什么错误或可以改进的地方吗 class Sample { private: char *bits; public: Sample() { bits = NULL; //should this be explicit? } ~Sample() { if (bits != NULL) { de

在下面的代码段中,为了获得相同的结果,显式需要赋值并检查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?
    }

};

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

Sample()
{
    bits = NULL;
}
您是否需要此分配取决于您的代码-如果
可能根本没有为其分配任何内存,则
NULL
分配应该存在,因为析构函数中有
删除
。实际上,作为一个安全问题,您可能希望使用
NULL
,除非您记录了用户必须遵守的一些契约,但由于您正在初始化指向
NULL
的指针,我将假设这意味着
实际上可能是
空的
,或者在某个点实际分配了
新的
内存

如果您没有初始化指针,并且随后从未通过分配某个对象而使其“有效”,并且该对象被销毁,那么坏东西就会发生

此外,作为一种习惯,在可能的情况下,在施工人员中:

Sample() 
    : bits(NULL)
{

}
对于析构函数,在删除它之前,不需要检查指针是否不是
NULL
<在
NULL
指针上的code>delete是完全安全的。您也不需要将
指针重新分配回
NULL
,对象将消失

~Sample()
{
    delete [] bits;
}

当然,如果您
删除了一个无效的指针,那么不管怎样都会发生不好的事情。

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

Sample()
{
    bits = NULL;
}
class Sample
{

private:
    char *bits;

public:

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


    ~Sample() 
    {   
           delete [] bits; 
    }

};
您是否需要此分配取决于您的代码-如果
可能根本没有为其分配任何内存,则
NULL
分配应该存在,因为析构函数中有
删除
。实际上,作为一个安全问题,您可能希望使用
NULL
,除非您记录了用户必须遵守的一些契约,但由于您正在初始化指向
NULL
的指针,我将假设这意味着
实际上可能是
空的
,或者在某个点实际分配了
新的
内存

如果您没有初始化指针,并且随后从未通过分配某个对象而使其“有效”,并且该对象被销毁,那么坏东西就会发生

此外,作为一种习惯,在可能的情况下,在施工人员中:

Sample() 
    : bits(NULL)
{

}
对于析构函数,在删除它之前,不需要检查指针是否不是
NULL
<在
NULL
指针上的code>delete
是完全安全的。您也不需要将
指针重新分配回
NULL
,对象将消失

~Sample()
{
    delete [] bits;
}

当然,如果你
删除了一个无效的指针,那么不管怎样,坏东西都会发生。

好的。除此之外,w.r.t上述代码是
delete[]位
删除位等效?@iJeeves对标量使用
删除位
,对数组使用
删除[]位
。您上面所说的是正确的。@iJeeves-抱歉,编辑了我的代码,因为您原来使用的是数组
删除
,而不是标量。它们不是同一事物,使用错误的形式是未定义的行为。它们不是等价的。delete[]位表示删除字符数组,而delete bit表示删除单个字符。一般经验法则:如果在new中使用[],请在deleteok中使用[]。除此之外,w.r.t上述代码是
delete[]位
删除位等效?@iJeeves对标量使用
删除位
,对数组使用
删除[]位
。您上面所说的是正确的。@iJeeves-抱歉,编辑了我的代码,因为您原来使用的是数组
删除
,而不是标量。它们不是同一事物,使用错误的形式是未定义的行为。它们不是等价的。delete[]bits表示删除一个字符数组,delete bits表示删除一个字符。一般经验法则:如果在new中使用[],请在delete中使用[]。编写此类类时不要忘记。
class Sample
{

private:
    char *bits;

public:

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


    ~Sample() 
    {   
           delete [] bits; 
    }

};