【问题标题】:Allocating memory - Pointers分配内存 - 指针
【发布时间】:2021-06-22 09:07:54
【问题描述】:

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

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

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

【问题讨论】:

  • 通常你会在相应的析构函数中删除它们(在本例中为~Objects。)
  • 那些是本地对象,因此你应该在离开构造函数之前删除它们,否则对它们的任何引用都会丢失并且你有泄漏。话虽如此,您很可能不需要任何指针,而且您肯定不需要使用new(我想您实际上是想初始化成员,但这不是代码的作用,请澄清)
  • 也许您不想使用原始指针,而是想要 std::unique_ptr。另外你确定要在构造函数中创建本地对象吗?
  • Obj one = new Obj; 将是一个错误。 one 不是指针。也许你想要Obj one;,但我质疑你为什么要创建在构造函数完成后不存在的本地对象。
  • 试试这里的搜索引擎,你会发现很多关于指针的有用参考,stackoverflow.com/questions/tagged/pointers?tab=Votesstackoverflow.com/questions/655065/…

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


【解决方案1】:

为简单起见,无论何时您创建new,您都应该创建一个对应的delete

在你的情况下,你必须最迟在你的对象Objects被删除之前删除分配的对象Obj,这意味着在Objectsdestructor中,这也意味着你必须保持一种方式在析构函数中访问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 所述/p>

【讨论】:

  • 如果new Obj 抛出异常,这也会泄漏内存。这就是为什么您应该始终使用智能指针或容器类的原因。永远不要尝试自己做new/delete。你很可能会把它搞砸。但更好的是,在可能的情况下(如本例),您应该只内联对象。
  • 感谢您的评论,我同意您对智能指针的看法。但是我提供了这个答案并没有谈论smart pointers,因为最初的问题是I would like to know when and if I need to use delete,他提供了一个类似的例子。我在回复中添加了您的评论。
【解决方案2】:

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

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

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

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

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

struct Objects {
    Obj objects[2];
};

【讨论】:

  • fyi,我尝试修复 OPs 问题,但我的编辑与您的答案不同步。如果你觉得你可以回滚我的回滚;)
  • @largest_prime_is_463035818 我不会假设 OP 知道初始化自动变量和在构造函数中初始化成员变量之间的区别,因此“修复”可能会令人困惑。由于类型错误,无论哪种方式都很难猜测。
猜你喜欢
  • 2015-04-21
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 2022-09-24
  • 2021-11-29
  • 2014-01-31
  • 2019-01-10
相关资源
最近更新 更多