gpt4 book ai didi

c++ - 间接堆分配中的堆栈或堆

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:11:36 27 4
gpt4 key购买 nike

在场景 1 中 funcVar 是在栈上还是堆上?

我问这个问题是因为我怀疑它是,因此这可能是一种减少内存泄漏的好方法。也就是说,给事物自动分配位置然后将代码放在堆上的较高级别可能会更好,这会像场景 1 那样间接地将事物放在堆上的较低级别。

在场景 2 中,删除可能永远不会被调用。通过使用场景 1 中的代码,我希望最大限度地减少(而不是消除)场景 2 中的问题。

场景一

class Test{
int memVar = 1;

void func(){
int funcVar = 2;
SomeClass::someFuncThatCouldCrash();
}
};

Test* t = new Test();

场景二

class Test{
int memVar = 1;

void func(){
int* funcVar = new int(2);
SomeClass::someFuncThatCouldCrash();
delete funcVar; //May not free due to crash in line above;
}
};

Test t; //or Test* t = new Test()

最佳答案

在场景 1 中 funcVar(假设它是 int funcVar = 2)在 func() 被调用时在堆栈上并且在场景中2 它在堆上。你是对的,如果 someFuncThatCouldCrash 抛出异常,它永远不会被删除。

另外,在场景 2 中,您删除了 funcVar 然后返回它……这不好。同样在这种情况下,当返回类型为常规 int 时,您将返回一个指针。

在 C++11 中,您永远不想处理原始的新建和删除。基本上,大多数东西都应该是堆栈上的变量。如果您需要堆分配,请使用类似 vector 的东西,它是堆栈上的局部变量,在内部管理堆分配。这样,当 vector 离开范围时,它会自行清理而无需调用 delete。如果您想进一步查找,这称为 RAII(资源分配即初始化)。

如果您确实需要一个指向对象的指针(例如通过基类指针保存一个多态对象,或者通常创建大型类的实例)那么您需要一个 std::unique_ptr 实质上是创建负责调用 delete 的局部变量。在极少数情况下,您可能还需要一个 std::shared_ptr,但如果需要,您可以查看它的作用以及为什么需要它。

关于c++ - 间接堆分配中的堆栈或堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40537404/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com