0

如果我有这个:

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

return *ptr;
}

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

4

5 回答 5

7

你有几个解决方案:

  • scoped_ptr
  • 在栈上声明一个变量
于 2012-04-23T16:53:15.060 回答
4

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

只需在堆栈上分配它:

double foo() {
    double d = 0;

    ...

    return d;
}

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

于 2012-04-23T16:54:47.410 回答
0

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

于 2012-04-23T16:55:46.857 回答
0

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

于 2012-04-23T16:55:55.040 回答
0

为什么要动态分配双精度?我想不出任何new double有意义的上下文。只需将 声明double 为局部变量。

如果涉及多态性,您唯一想要动态分配其生命周期在函数末尾结束的对象的时间。在这些情况下,您可以使用std::auto_ptr(或者 std::unique_ptr如果您确定您将看到的所有编译器都将支持 C++11)。

于 2012-04-23T16:58:26.950 回答