返回指针的函数是否要求我删除返回的值?

Do functions that return pointers require that I delete the value that is returned?

本文关键字:返回 删除 指针 函数 是否      更新时间:2023-10-16

假设我有一个执行某些任务的函数。该函数返回指向 int 的指针。我的问题是:我必须释放内存还是这种通用格式可以?


int *do_something()
{
int *local{ new int };
//do_something_here
return local;
delete local;
}
int main()
{
int *result{ new int };
result = do_something();
delete result;
return 0;
}

要记录对象所有权的转移并防止内存泄漏,应使用unique_ptr返回堆上分配的对象。这是C++最佳实践。

有关更多详细信息,请参阅C++核心准则:切勿通过原始指针 (T*) 或引用 (T&) 转让所有权:

原因

如果怀疑调用方或被调用方是否拥有对象,则会发生泄漏或过早破坏。

我的问题是:我必须释放内存还是这种通用格式可以?

是的,如果动态分配内存,则必须释放内存。否则,您将冒着程序的内存使用不受控制地增长并消耗所有可用内存的风险 - 或者至少消耗超过必要的内存。

返回指针的函数是否要求我删除返回的值?

仅仅因为函数返回指针,并不一定意味着必须删除它。举个例子:

int* a_function(int* ptr) {
return ptr + 1;
}
int main() {
int arr[2];
int* iptr = a_function(arr);
// must not delete iptr
}

函数可以要求调用方删除返回的指针。看来您的do_something示例函数就是这样的函数。对于一个功能来说,这是一个非常糟糕的设计。如果分配的所有权转移给调用方,则应改用智能指针。


return local;
delete local;

回来后有声明是没有意义的。他们永远不会被处决。

int *result{ new int };
result = do_something();

在这里,您将丢失新表达式返回的值。因此,无法再delete该值 - 后面的delete将删除新值。这种指针值丢失以及由此导致的无法释放内存称为内存泄漏