首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新内存管理和删除内存管理

新内存管理和删除内存管理
EN

Stack Overflow用户
提问于 2013-04-22 11:06:57
回答 4查看 1.1K关注 0票数 1
代码语言:javascript
复制
void f(const Fraction& a)
{ Fraction b = a;
  Fraction* c = new Fraction(3, 4);
  Fraction* d = &a;
  Fraction* e = new Fraction(7, 8);
  Fraction* f = c;
  delete f;
 }
  1. 我要删除哪些值?我认为我只删除了动态分配的c,其余的对象在函数结束时会自动销毁。
  2. 那e呢?它也是动态分配的,但是我们没有对e的任何删除操作符。e没有被取消分配吗?

谢谢,

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-04-22 11:14:08

您可能缺少的关键洞察力是,delete与特定变量没有任何关系--它与存储在特定内存地址的特定对象有关系。通常的规则是:“使用new分配的任何对象都必须用delete来释放。”但是请注意对象这个词的用法-不是变量。

考虑:

代码语言:javascript
复制
Fraction* a = new Fraction(3,4);
Fraction* b = a;
delete b;

在本例中,我们删除了b,它指向第一行中分配的Fraction对象。我们也可以删除a,它指向同一个Fraction对象。只要我们删除分配给的每个new对象(不管我们使用哪个指针变量访问对象),就不会有内存泄漏。还请注意,如果我们同时删除ab,那么就会有一个错误(通过double-delete未定义的行为)。

票数 5
EN

Stack Overflow用户

发布于 2013-04-22 11:09:09

您应该删除c (或f),但不能同时删除两者,并且应该删除e。对于每个new,应该是delete

票数 4
EN

Stack Overflow用户

发布于 2013-04-22 11:08:19

  1. 您将删除用new Fraction(3, 4);创建的对象
  2. 是的,e或更严格地说,使用new Fraction(7, 8);分配的内存不会被释放,从而导致内存泄漏。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16145638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档