问题描述
我想知道何时或是否必须删除此对象。 这是一个基本类 Object 的构造函数 对象.cpp:
Objects::Objects{
Obj one = new Obj;
Obj two = new Obj;
}
我知道在分配内存时您应该在某个时候删除它,但是我已经在构造函数中分配了内存并想再次使用变量一和二。我什么时候删除它们?
解决方法
为简单起见,无论何时生成 new
,都应生成相应的 delete
。
在您的情况下,您必须最迟在删除对象 Obj
之前删除分配的对象 Objects
,这意味着在 destructor
的 Objects
中,这也意味着您必须保留一种方法来访问析构函数处的 one
和 two
指针(一种方法可能是使它们成为 Objects
的成员)。您当前的情况没有这样做,因为 one
和 two
是局部变量而不是指针。
它可能如下所示:
class Objects
{
public:
Objects();
virtual ~Objects();
private:
Obj* one;
Obj* two;
};
Objects::Objects{
one = new Obj;
two = new Obj;
}
Objects::~Objects{
delete one;
delete two;
}
在处理资源管理时,您需要注意一些规则,rule of three/five/zero 将指导您在资源管理方面创建健壮的代码。
另外一句话:
使用 smart pointers 可能会更好,即使使用我在帖子中提到的方法,如果在您的代码执行 delete
行之前发生异常或崩溃,您仍然会出现内存泄漏,如解释here
我想知道何时或是否必须删除此对象。
如果你用 new
分配而不释放,那么你会泄漏内存。
我已经在构造函数中分配了内存,想再次使用变量一和二,我什么时候删除它们?
如果你想在构造函数中初始化变量并在以后使用它们,那么你应该在构造函数中使用非静态成员变量而不是自动变量。
如果你要在构造函数中分配内存,并用一个成员指向它,那么通常你应该在析构函数中释放内存。有关更多信息,请参阅资源获取即初始化习语。但是,您不应该使用裸拥有指针,也不应该不必要地使用动态分配。这是我推荐作为您的首选的一个简单示例:
struct Objects {
Obj objects[2];
};