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