c ++是否需要释放具有保留内存的局部变量?

时间:2013-09-05 10:52:29

标签: c++ delete-operator

我只是一个问题。 我一直在寻找答案,但我可能找不到正确的标签或单词来找到解决方案......

问题是,如标题所示:是否需要释放局部变量(具有保留内存)?我的意思是,例如,如果我有以下功能:

myClass* myFunction(){
myClass* A = new myClass;
return A;
}

如果是“是”,我应该在哪里拨打“删除”? “回归”之前和之后都是胡说八道......

我是对的吗?

4 个答案:

答案 0 :(得分:13)

除非您需要,否则请勿使用new

这可以避免new,因此无需删除

myClass myFunction(){
    myClass A;
    return A;
}

如果您认为需要指针,请考虑使用智能指针。

如果你想要原始指针的兴奋,这个函数返回一个指向调用者的原始指针,他们必须在完成后删除它。

myClass * myFunction(){
    myClass * A = new myClass;
    return A;
}

myClass * thing = myFunction();
//stuff, that might throw an exception, so watch it
// smart pointers FTW
delete thing;

答案 1 :(得分:4)

假设您的类型定义如下:

class myClass { /* ... */ };

你的例子不是正确的C ++(除非你有一个myClass*转换构造函数,你可能没有)。

您不必new一个位于自动内存中的对象:

myClass myFunction(){
  myClass a;
  return a;
}

动态内存上新建对象时,可以将其放入自动内存中的指针变量中:

myClass* myFunction(){
  myClass* a = new myClass;
  return a;
}

此处,a可能会泄漏,如果调用者没有释放它。

答案 2 :(得分:2)

据推测,除非你做一些有趣的运算符重载,否则你的意思是将新的myClass赋值给指针并返回指针

myClass *myFunction(){
  myClass *A = new myClass;
 return A;
}

如果是这种情况,那么是的,你必须在某个时候删除它。由此函数的调用者决定保留指针并在适当时删除它。

或者,您可以使用智能指针。

答案 3 :(得分:1)

使用shared_ptr而不是原始指针。

std::shared_ptr<myClass> myFunction()
{
    std::shared_ptr<myClass> A = std::make_shared<myClass>(constructor parameters, if any);
    return A;
}

void f()
{
    std::shared_ptr<myClass> A = myFunction();
}

这将模拟Java风格的垃圾收集。