在作用域之外新建和删除内存管理

new and delete Memory Management out of scope

本文关键字:删除 内存 管理 新建 作用域      更新时间:2023-10-16
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没有被取消分配?

谢谢,

您可能在这里忽略的关键洞察是delete与特定的变量没有任何关系-它与存储在特定内存地址的特定对象有关系。通常的规则是"任何用new分配的对象都必须用delete分配",但是注意使用了object这个词,而不是变量。

考虑:

Fraction* a = new Fraction(3,4);
Fraction* b = a;
delete b;

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

您应该删除c(或f),但不能两者都删除,您应该删除e。每个new应该是delete

  1. 您将删除使用new Fraction(3, 4);创建的对象
  2. e或更严格地说new Fraction(7, 8);分配的内存不会被释放导致内存泄漏。

你应该删除(c或f) &e