分配内存 - 指针

时间:2021-03-25 14:32:12

标签: c++ pointers memory-management destructor rule-of-three

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

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

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

2 个答案:

答案 0 :(得分:4)

为简单起见,无论何时生成 new,都应生成相应的 delete

在您的情况下,您必须最迟在删除对象 Obj 之前删除分配的对象 Objects,这意味着在 destructorObjects 中,这也意味着您必须保留一种方法来访问析构函数处的 onetwo 指针(一种方法可能是使它们成为 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;
}

在处理资源管理时,您需要注意一些规则,rule of three/five/zero 将指导您在资源管理方面创建健壮的代码。

另外一句话: 使用 smart pointers 可能会更好,即使使用我在帖子中提到的方法,如果在您的代码执行 delete 行之前发生异常或崩溃,您仍然会出现内存泄漏,如解释here

答案 1 :(得分:1)

<块引用>

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

如果你用 new 分配而不释放,那么你会泄漏内存。

<块引用>

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

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

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

struct Objects {
    Obj objects[2];
};