C++ 新建和删除超出范围的内存管理
我应该删除哪些值? 我想我只删除了动态分配的c,其余的对象在函数结束时会自动销毁C++ 新建和删除超出范围的内存管理,c++,memory-management,memory-leaks,new-operator,C++,Memory Management,Memory Leaks,New Operator,我应该删除哪些值? 我想我只删除了动态分配的c,其余的对象在函数结束时会自动销毁 e怎么样?它也是动态分配的,但是我们没有任何用于e的删除操作符。e是否未取消分配 谢谢 您将删除使用新分数(3,4)创建的对象 是e或者更严格地说是分配了新分数的内存(7,8)将不会解除分配,从而导致内存泄漏 您将删除使用新分数(3,4)创建的对象 是e或者更严格地说是分配了新分数的内存(7,8)将不会解除分配,从而导致内存泄漏 您应该删除c(或f),但不能同时删除两者,您应该删除e。对于每个new都应该delet
新分数(3,4)创建的对象代码>
e
或者更严格地说是分配了新分数的内存(7,8)代码>将不会解除分配,从而导致内存泄漏
新分数(3,4)创建的对象代码>
e
或者更严格地说是分配了新分数的内存(7,8)代码>将不会解除分配,从而导致内存泄漏
您应该删除
c
(或f
),但不能同时删除两者,您应该删除e
。对于每个new
都应该delete
您应该删除c
(或f
),但不能同时删除两者,您应该删除e
。对于每个新的应该删除您应该删除(c或f)&e您应该删除(c或f)&e此处您可能缺少的关键洞察是delete
与特定变量没有任何关系-它与存储在特定内存地址的特定对象有关系。通常的规则是“任何分配了new
的对象都必须处理delete
”,但请注意object一词的使用不可变
考虑:
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;
}
在本例中,我们删除了b
,它指向在第一行分配的分数
对象。我们还可以删除a
,它指向相同的分数
对象。只要我们删除分配给new
的每个对象(无论我们使用哪个指针变量访问该对象),就不会有内存泄漏。还要注意,如果我们同时删除a
和b
,那么我们就有一个错误(通过a定义的行为未定义)。这里您可能缺少的关键洞察是delete
与特定变量没有任何关系-它与存储在特定内存地址的特定对象有关系。通常的规则是“任何分配了new
的对象都必须处理delete
”,但请注意object一词的使用不可变
考虑:
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;
}
在本例中,我们删除了b
,它指向在第一行分配的分数
对象。我们还可以删除a
,它指向相同的分数
对象。只要我们删除分配给new
的每个对象(无论我们使用哪个指针变量访问该对象),就不会有内存泄漏。还请注意,如果同时删除a
和b
,则会出现错误(通过a的行为未定义)。delete
不会删除变量。它删除指针变量指向的已分配内存。您有两个new
s和一个delete
。你漏了一个分数。我想第三行是不可能的。你用一个(非常量)指针指向一个常量对象。一个更重要的问题是:当分数明显支持复制和赋值时,为什么要动态分配它?是的,那是我的错误。我试图找出哪些值被删除,哪些对象也被删除。谢谢<代码>删除
不删除变量。它删除指针变量指向的已分配内存。您有两个new
s和一个delete
。你漏了一个分数。我想第三行是不可能的。你用一个(非常量)指针指向一个常量对象。一个更重要的问题是:当分数明显支持复制和赋值时,为什么要动态分配它?是的,那是我的错误。我试图找出哪些值被删除,哪些对象也被删除。谢谢但是他可以很容易地删除e
和f
。(事实上,他已经删除了f
),但他可以同样轻松地删除e
和f
。(事实上,他已经删除f
)