关于c ++:返回指针的函数是否需要删除返回的值?

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

本问题已经有最佳答案,请猛点这里访问。

假设我有一个执行某项任务的函数。 该函数返回一个指向int的指针。 我的问题是这样的:我是否必须释放内存或这种通用格式好吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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&)转移所有权:

Reason

If there is any doubt whether the caller or the callee owns an object, leaks or premature destruction will occur.


My question is this: do I have to deallocate memory or is this general format okay?

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

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

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

1
2
3
4
5
6
7
8
9
int* a_function(int* ptr) {
    return ptr + 1;
}

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

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

1
2
return local;
delete local;

返回后发表声明毫无意义。它们永远不会被执行。

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

在这里,你丢失了new-expression返回的值。因此,不再可能delete该值 - 后来的delete会删除新值。这种指针值的丢失以及随后无法释放内存被称为内存泄漏。