在作用域之外新建和删除内存管理
new and delete Memory Management out of scope
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没有被取消分配?
谢谢,
您可能在这里忽略的关键洞察是delete
与特定的变量没有任何关系-它与存储在特定内存地址的特定对象有关系。通常的规则是"任何用new
分配的对象都必须用delete
分配",但是注意使用了object这个词,而不是变量。
考虑:
Fraction* a = new Fraction(3,4);
Fraction* b = a;
delete b;
在本例中,我们删除了b
,它指向第一行分配的Fraction
对象。我们也可以删除a
,它指向同一个Fraction
对象。只要我们删除每个对象分配new
(不管我们使用哪个指针变量访问对象),就不会有内存泄漏。还要注意的是,如果我们同时删除 a
和b
,那么我们就会出现错误(通过双删除未定义的行为)。
您应该删除c
(或f
),但不能两者都删除,您应该删除e
。每个new
应该是delete
- 您将删除使用
new Fraction(3, 4);
创建的对象 - 是
e
或更严格地说new Fraction(7, 8);
分配的内存不会被释放导致内存泄漏。
你应该删除(c或f) &e
相关文章:
- 在c++中删除内存失败
- delete[]有问题,如何部分删除内存
- 在这种情况下,我必须删除内存吗?
- STD分配器是否会在堆上动态分配内存?它可以安全地删除内存吗?
- 我可以在使用 winsoc 发送缓冲区后删除内存吗?
- 最好的方法是删除内存泄漏
- com,删除内存,而不是调用版本()
- 如何调用返回后删除[]内存
- 删除内存空间后,指针的值保持不变还是更改?对象内容是否将被更改
- unique_ptr的矢量未被完全删除(内存泄漏)
- 在析构函数中安全地删除内存
- (C++) list.error 方法和使用指针删除内存
- 为结构C++中的指针分配和删除内存
- 正在读取指向已删除内存未定义行为的指针
- 何时会在单一实例中删除内存
- 删除内存时遇到困难
- 在 go 中删除内存
- 在C++中使用智能指针分配和删除内存的有效方法
- Cpp删除内存
- 手动调用析构函数后如何删除内存