执行以下操作,会产生内存问题(没有正确删除的新分配) 假设一个名为“object”的对象
class aClass
{
private:
object* myobject;
public:
aClass() : myobject(NULL) {};
~aClass()
{
if(myobject)
delete myobject;
myobject = NULL;
}
void myfuction()
{
if(myobject)
myobject = new object();
}
}
调用myfunction()经常会创建永不释放的内存,或者我创建变量并将其复制到myobject这一事实是安全的,因为最后myobject会被删除吗?
答案 0 :(得分:2)
调用
myfunction()
经常会创建永不释放的内存,
目前编写此函数时,它根本不会分配任何内存,因为您已经(正确地)在构造函数中初始化了指针:
aClass() : myobject(NULL) {};
// ^^^^
所以myfunction()
if(myobject)
永远不会被满足,假设myobject
内存分配的唯一代码位于myfunction()
。
或者我创建变量并将其复制到myobject这一事实是安全的,因为最后myobject会被删除?
好吧,为delete
指针调用NULL
是透明的,并且不会失败。
其实我觉得你想这样写myfunction()
:
void myfuction() {
if(!myobject)
// ^ Check if myobject is NULL
myobject = new object();
}
只要aClass
实例超出范围,析构函数就会正确删除已分配的内存。
但请注意Rule of Three以及其他会影响myobject
成员作业的操作。