我可以在C++中手动删除堆栈变量/内存吗?
我看到很多帖子说“你不需要手动释放内存”,但没有真实的的答案。
基本上,我有一个类:
class Foo {
Bar variable_1;
Baz* variable_2;
public:
Foo();
~Foo();
}
其中Bar
和Baz
是匿名类型,variable_2
是堆分配类型。
在析构函数~Foo()
中,我需要删除variable_2
之前的variable_1
(or否则将存在存储器存取违规)。
void Foo::~Foo() {
// delete stack variable [variable_1] here...
delete variable_2;
}
在类析构函数中,必须先删除variable_2
(以防止内存泄漏),
并且在函数结束之后删除variable_1
。
我怎样才能达到上述目标?
或者,有没有更好的方法来做到这一点?
任何想法都是赞赏。
1条答案
按热度按时间rsaldnfx1#
我需要在
variable_2
之前删除variable_1
(否则将出现内存访问冲突)。那就修好它。
只有当你对
variable_2
所指向的对象的所有权感到困惑的时候,你才“需要”这个。如果Foo
拥有这个对象,那么当Foo
试图删除它的时候,其他人不应该试图访问它。如果variable_1
需要在它的析构函数中访问它,那么它应该拥有这个对象。也就是说,Bar
应该负责销毁它。你需要弄清楚谁负责销毁对象,并让你的代码反映这一点。如果
Bar
需要一个Foo
将使用的Baz
,那么它是Bar
的构造函数,应该创建它和Bar
的析构函数,应该销毁它。Foo
应该得到一个指针,如果它想使用它,但不应将其存储为直接成员。如果由于某种原因,你不能计算出合理的所有权语义,那么你可以使用一个
shared_ptr<Baz>
,它 * 同时 * 存储Bar
和Foo
。Foo
大概创建了对象,并将shared_ptr
传递给Bar
。这样,只有在它们都使用完各自的shared_ptr
之后,它才会被销毁。