gpt4 book ai didi

c++ - 函数调用中的堆和删除。如何删除本地动态内存?

转载 作者:太空狗 更新时间:2023-10-29 21:44:30 25 4
gpt4 key购买 nike

我知道已经动态分配并使用堆的内存需要使用delete手动删除。如果在将超出范围的类函数中创建动态对象,是否也是这种情况?这是一个片段。

    Fraction* Fraction::add(const Fraction* fr) const{ 
int gcd;
Fraction* temp;

gcd = gcdRecur(num * fr->denom + fr->num * denom,
denom * fr->denom);

temp = new Fraction((num * fr->denom + fr->num * denom) / gcd,
(denom * fr->denom) / gcd);

return temp;
}

在这种情况下,temp 是指向使用“new”(对吗?)的 Fraction 类型的动态对象的指针。如果我将这个指针返回到类函数“add”被调用的地方,我是否需要删除本地指针“temp”?如果可以,我该如何实现?

编辑:我对在此类成员中使用 new 的(错误的)解释是因为 Fraction 对象是通过指向 Fractions 的指针实例化的(像这样):

    int main() {
menu()
return 0;
}

void menu() {
Fraction* fr1 = 0;
Fraction* fr2 = 0;
Fraction* fr3 = 0;
// ... user chooses to initialize, so fr1, fr2, fr3 no longer null

// ... user chooses to add. call submenu, pass fr1, fr2, fr3 by POINTERS?
addMenu(fr1, fr2, &fr3);
}

看起来很糟糕...这是 addMenu 的 header :

     void addMenu(const FractionTeddyD*, const FractionTeddyD*, FractionTeddyD**);

编辑 #2:在不使用"new"的情况下解决。

最佳答案

确实需要删除,否则内存会泄露。您不能在本地删除它,因为调用者需要在函数返回后使用它。一旦不再需要,调用者必须将其删除。显然,这很容易出错,这就是为什么您应该始终使用 RAII 的原因。管理动态资源。

在这种情况下,您应该将返回类型更改为智能指针,如std::unique_ptr<Fraction>。 .

另一方面,你为什么要使用 new在这里吗?返回一个值会更简单,而且几乎肯定会更快。

关于c++ - 函数调用中的堆和删除。如何删除本地动态内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19913124/

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