Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从函数返回值之前删除指针_C++ - Fatal编程技术网

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*