【问题标题】:C++ Memory Leak new operatorC++ 内存泄漏新运算符
【发布时间】:2013-04-20 02:25:29
【问题描述】:

我需要确定哪些对象被销毁,以及这段代码是否存在内存泄漏。

  void myfunc()
  { 
    Photo a(1, 2);
    Photo* pt = new Photo(2, 3);
    throw runtime_error("to test the exception");
  }

我的回答是

对象在函数结束后被销毁 , 通过自动调用 Photo 类的析构函数。

存在内存泄漏。 我们没有删除使用 new 运算符动态分配的 pt。 所以我们需要添加delete pt;在函数结束时。

我的回答对吗?

【问题讨论】:

  • 你的答案是错误的。这就是发明智能指针的原因。
  • @chris 这个问题的措辞很奇怪,但我认为答案是正确的,而您的评论是错误的。
  • @MooingDuck,我最具体的说的是把delete pt; 放在最后。 AFAIK,在该行之前抛出异常时不会执行。
  • @chris 好电话,我忽略了那部分
  • 哦,智能指针...有人可以用智能指针显示示例吗?

标签: c++ pointers memory-management memory-leaks new-operator


【解决方案1】:

你错了。试试这个:

void myfunc()
{ 
   Photo a(1, 2);
   Photo* pt = new Photo(2, 3);
   throw runtime_error("to test the exception");
   delete pt;
}

在 valgrind 下编译和运行。你会得到一个泄漏 - delete pt; 永远不会到达。

【讨论】:

  • 那我应该把 delete pt;在投掷线之前??
  • 如果您必须在此处使用delete,则需要将其放在 throw 之前以便执行。如果您不需要使用 delete,请使用智能指针 (std::unique_ptr)。基于范围的资源管理 (SBRM) 想成为您的朋友。
  • 没有。不。这在一般情况下无济于事。您应该使用 RAII - 即智能指针,正如 chris 和 Captain Obvlious 在他们的 cmets 中所指出的那样。如果这不可能,请使用trycatch (...) { delete pt; throw; }
  • @CaptainObvlious,我从未听说过这个具体的术语,但我确实比 RAII 更喜欢它。很遗憾,当我搜索 SBRM 时,首先出现的是圣巴巴拉救援任务。
  • 显然我今天有一个单词关联问题...应该阅读范围 Bound 资源管理。 SBRM 和 RAII 是一回事。成员变量的范围仅限于声明它们的类,就像局部变量的范围仅限于函数一样。这称为自动存储持续时间,因为它们是自动创建和销毁的。通过new和`delete分配和释放的资源具有动态存储时长,需要手动管理。
猜你喜欢
  • 2021-05-08
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多