在下面的代码段中明确要求赋值和检查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?
}
};
答案 0 :(得分:7)
在第一种情况下,您在构造函数中执行此操作:
Sample()
{
bits = NULL;
}
您是否需要此分配取决于您的代码 - 如果bits
可能根本没有分配任何内存,那么NULL
分配应该在那里,因为{{1}在析构函数中。实际上作为一个安全问题,您可能需要delete
,除非您记录用户必须遵守的一些合同,但是在这里,因为您正在初始化指向NULL
的指针,我将假设这意味着{{ 1}}实际上可能是NULL
或实际上有bits
- 在某个时刻分配了内存。
如果你没有初始化指针,并且之后永远不会因为被赋予某些东西而变得“有效”,并且对象被破坏,那么就会发生不好的事情。
另外,作为习惯,prefer to use initialization lists在构造函数中尽可能:
NULL
对于析构函数,在删除指针之前,不需要检查指针是否不是new
。 Sample()
: 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;
}
};