C++ 从函数返回值之前删除指针
如果我有这个:C++ 从函数返回值之前删除指针,c++,C++,如果我有这个: double foo() { double* ptr = new double(0); return *ptr; } 如果返回前未删除ptr,是否会导致内存泄漏?因此,在从函数返回之前删除ptr的正确方法是什么?您有几种解决方案: 作用域ptr 在堆栈上声明变量 如果您不希望对象(与其值相反)超出函数的范围,那么动态分配它就没有多大意义 只需在堆栈上分配它: double foo() { double d = 0; ... return d; }
double foo()
{
double* ptr = new double(0);
return *ptr;
}
如果返回前未删除ptr,是否会导致内存泄漏?因此,在从函数返回之前删除ptr的正确方法是什么?您有几种解决方案:
- 作用域ptr
- 在堆栈上声明变量
double foo() {
double d = 0;
...
return d;
}
另一种方法是让对象存在于函数范围之外,在这种情况下,您不希望在返回之前删除它。最好的管理方法是使用某种智能指针(在大多数情况下,它会自动处理内存管理)。如果您返回由
ptr
指向的值,那么您肯定不想在离开函数之前删除它。如果删除它然后返回,调用函数将尝试访问已释放的内存,这是禁止的。只要在调用函数的同一类中的指针中收到foo()的返回值,就可以了。之后,当您不再需要该指针时,可以在该指针上使用delete…为什么要动态分配double?我想不出有什么
new double
有意义的上下文。只需声明double
作为局部变量
这大概是你唯一一次想动态分配一个对象
如果多态性是
卷入的在这些情况下,您可以使用std::auto_ptr
(或
std::unique\u ptr
如果您确信您将使用的所有编译器
请参阅将支持C++11)。如果
范围内的ptr
不可用,自动ptr
将在必要时执行。这是一个不会导致任何问题的用例。如果unique\u ptr
不可用,则只使用scoped\u ptr
或auto\u ptr
。是的,这会导致内存泄漏,但无论如何,这似乎是一个坏例子。。。你不需要分配新的内存就可以得到一个double,我建议:voidfoo(double*d);然后传入指针,您可以在函数内部设置值,然后管理内存。他在返回之前取消引用指针,所以他得到了值。请注意,返回类型是double
而不是double*
。