在C++中手动删除堆栈内存

jvlzgdj9  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(185)

我可以在C++中手动删除堆栈变量/内存吗?
我看到很多帖子说“你不需要手动释放内存”,但没有真实的的答案。
基本上,我有一个类:

class Foo {
    Bar variable_1;
    Baz* variable_2;
public:
    Foo();
    ~Foo();
}

其中BarBaz是匿名类型,variable_2是堆分配类型。
在析构函数~Foo()中,我需要删除variable_2之前的variable_1
(or否则将存在存储器存取违规)。

void Foo::~Foo() {
    // delete stack variable [variable_1] here...    
    delete variable_2;
}

在类析构函数中,必须先删除variable_2(以防止内存泄漏),
并且在函数结束之后删除variable_1
我怎样才能达到上述目标?
或者,有没有更好的方法来做到这一点?
任何想法都是赞赏。

rsaldnfx

rsaldnfx1#

我需要在variable_2之前删除variable_1(否则将出现内存访问冲突)。
那就修好它。
只有当你对variable_2所指向的对象的所有权感到困惑的时候,你才“需要”这个。如果Foo拥有这个对象,那么当Foo试图删除它的时候,其他人不应该试图访问它。如果variable_1需要在它的析构函数中访问它,那么它应该拥有这个对象。也就是说,Bar应该负责销毁它。
你需要弄清楚谁负责销毁对象,并让你的代码反映这一点。如果Bar需要一个Foo将使用的Baz,那么它是Bar的构造函数,应该创建它和Bar的析构函数,应该销毁它。Foo应该得到一个指针,如果它想使用它,但不应将其存储为直接成员。
如果由于某种原因,你不能计算出合理的所有权语义,那么你可以使用一个shared_ptr<Baz>,它 * 同时 * 存储BarFooFoo大概创建了对象,并将shared_ptr传递给Bar。这样,只有在它们都使用完各自的shared_ptr之后,它才会被销毁。

相关问题