是否在下面的代码段中明确要求赋值和检查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)
在第一种情况下,您在构造函数中执行此操作:
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在删除指针之前不需要检查指针是否存在.delete在NULL指针上是完全安全的.您也不需要将bits指针重新分配回来NULL,对象就会消失.
~Sample()
{
delete [] bits;
}
Run Code Online (Sandbox Code Playgroud)
当然,如果你delete指针无效,那么无论如何都会发生不好的事情.