在从函数返回值之前删除指针

时间:2012-04-23 16:51:31

标签: c++

如果我有这个:

double foo()
{
double* ptr = new double(0);

return *ptr;
}

如果在返回之前没有删除ptr,这会导致内存泄漏吗?因此,在从函数返回之前删除ptr的正确方法是什么?

5 个答案:

答案 0 :(得分:7)

您有几种解决方案:

  • scoped_ptr的
  • 在堆栈上声明变量

答案 1 :(得分:4)

如果您不希望对象(而不是其值)存在于函数范围之外,那么动态分配它没有多大意义。

只需在堆栈上分配它:

double foo() {
    double d = 0;

    ...

    return d;
}

替代方法是让对象存在于函数范围之外,在这种情况下,您不希望在返回之前删除它。管理它的最佳方法是使用某种智能指针(在大多数情况下,这会自动处理内存管理)。

答案 2 :(得分:0)

如果您要返回ptr指向的值,那么您肯定会在离开该函数之前想要删除它。如果你删除它然后返回它,调用函数将尝试访问已被释放的内存,这是禁止的。

答案 3 :(得分:0)

只要您在调用函数的同一个类中的指针中收到foo()的返回值,就可以了。之后,当你不再需要它时,可以在该指针上使用delete ...

答案 4 :(得分:0)

为什么要动态分配双精度?我什么都想不到 new double有意义的上下文。只需声明double 作为一个局部变量。

关于你唯一想要以动态方式分配对象的时间 如果是多态的话,函数结束时的生命周期结束 参与其中。在这些情况下,您可以使用std::auto_ptr(或 std::unique_ptr如果您确定所有编译器都是您将要的 看,将支持C ++ 11)。