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;
}
我要删除哪些值? 我想我只删除动态分配的c,并在函数结束时自动销毁其余的对象。
e怎么样?它也是动态分配的,但我们没有e的删除操作符。 e没有取消分配?
谢谢,
答案 0 :(得分:5)
您可能在这里遗漏的关键见解是delete
与特定的变量没有任何关系 - 它与特定的对象有关系存储在某个内存地址。通常会将“使用new
分配的任何对象都必须与delete
取消分配”。但请注意使用 object 这个词 - 不是变量。
考虑:
Fraction* a = new Fraction(3,4);
Fraction* b = a;
delete b;
在此示例中,我们删除了b
,它指向第一行分配的Fraction
对象。我们也可以删除a
,它指向同一个Fraction
对象。只要我们删除用new
分配的每个 对象 (无论我们使用哪个指针变量来访问对象),都没有内存泄漏。另请注意,如果我们删除 a
和b
,那么我们就会出现错误(通过double-delete进行未定义的行为)。
答案 1 :(得分:4)
您应该删除c
(或f
),但不能同时删除两者,您应该删除e
。每个new
应为delete
。
答案 2 :(得分:1)
new Fraction(3, 4);
e
或更严格地说,分配有new Fraction(7, 8);
的内存不会被解除分配,导致内存泄漏。答案 3 :(得分:1)
你应该删除(c或f)& ë