提问者:小点点

分配内存指针


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

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

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


共2个答案

匿名用户

为了简单起见,任何时候创建new时,都应该创建相应的delete

在您的情况下,您必须最迟在删除您的对象obj之前删除已分配的对象object,这意味着在objects析构函数中,这也意味着您必须保留一种方法来访问析构函数处的一个两个指针(一种方法可能是使它们成为objects的成员)。您当前的案例无法这样做,因为OneTwo是局部变量,而不是指针。

可能如下所示:

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行之前发生了异常或崩溃,您仍然会出现内存泄漏,正如这里所解释的

匿名用户

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

如果使用new分配而不释放,则会泄漏内存。

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

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

如果您要在构造函数中分配内存,并用一个成员指向它,那么通常您应该在析构函数中释放内存。有关更多信息,请参见资源获取是初始化习惯用法。但是,您不应该使用裸露的拥有指针,也不应该不必要地使用动态分配。下面是一个简单的示例,我推荐您作为第一个选项:

struct Objects {
    Obj objects[2];
};