如果我有这个:
double foo()
{
double* ptr = new double(0);
return *ptr;
}
如果在返回之前没有删除ptr,这会导致内存泄漏吗?因此,在从函数返回之前删除 ptr 的正确方法是什么?
如果我有这个:
double foo()
{
double* ptr = new double(0);
return *ptr;
}
如果在返回之前没有删除ptr,这会导致内存泄漏吗?因此,在从函数返回之前删除 ptr 的正确方法是什么?
你有几个解决方案:
如果您不希望对象(与其值相反)存在于函数范围之外,那么动态分配它就没有多大意义。
只需在堆栈上分配它:
double foo() {
double d = 0;
...
return d;
}
另一种方法是让对象存在于函数范围之外,在这种情况下,您不想在返回之前将其删除。管理它的最好方法是使用某种智能指针(在大多数情况下它会自动处理内存管理)。
如果您要返回指向的值,ptr
那么您绝对不想在离开函数之前将其删除。如果你删除它然后返回它,调用函数将尝试访问已释放的内存,这是禁止的。
只要您在调用函数的同一个类中的指针中收到 foo() 的返回值,就可以了。之后,当您不再需要它时,您可以在该指针上使用 delete ......
为什么要动态分配双精度?我想不出任何new double
有意义的上下文。只需将 声明double
为局部变量。
如果涉及多态性,您唯一想要动态分配其生命周期在函数末尾结束的对象的时间。在这些情况下,您可以使用std::auto_ptr
(或者
std::unique_ptr
如果您确定您将看到的所有编译器都将支持 C++11)。