1

我想知道何时或是否必须删除此对象。这是一个基本类 Object Object.cpp 的构造函数:

Objects::Objects{
    Obj one = new Obj;
    Obj two = new Obj;
}

我知道在分配内存时应该在某个时候将其删除,但是我已经在构造函数中分配了内存并且想再次使用变量一和二。我什么时候删除它们?

4

2 回答 2

4

为简单起见,无论何时制作new,都应该制作相应的delete

在您的情况下,您必须Obj最迟在删除对象之前删除分配的对象Objects,这意味着在destructorof 中Objects,这也意味着您必须保留一种访问析构函数中的onetwo指针的方法(一种方法可能是使他们成为Objects) 的成员。您当前的情况未能这样做,因为oneandtwo是局部变量而不是指针。

它可能如下所示:

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;
}

在处理资源管理时,您需要了解一些规则,这是三/五/零的规则,它将指导您在资源管理方面创建健壮的代码。

另一句话:使用智能指针可能会更好,即使使用我在帖子中提到的方法,如果在您的代码执行这些delete行之前发生异常或崩溃,您仍然会出现内存泄漏,如此处所述

于 2021-03-25T14:40:59.553 回答
1

我想知道何时或是否必须删除此对象。

如果您分配new并且不取消分配,那么您会泄漏内存。

我已经在构造函数中分配了内存,想再次使用变量一和二,我什么时候删除它们?

如果你想在构造函数中初始化变量并在以后使用它们,那么你应该在构造函数中使用非静态成员变量而不是自动变量。

如果你要在构造函数中分配内存,并用一个成员指向它,那么通常你应该在析构函数中释放。有关详细信息,请参阅资源获取是初始化习语。但是,您不应该使用裸拥有指针,也不应该使用不必要的动态分配。这是一个简单的示例,我建议您将其作为您的首选:

struct Objects {
    Obj objects[2];
};
于 2021-03-25T14:37:13.880 回答