从函数返回堆分配的指针好吗?

alw*_*ent 5 c c++ pointers

当我们从函数返回时,如果返回值是一个指针,它必须定义为静态的。对于堆内存分配的指针(例如new/malloc指针)也是如此吗?

考虑这个例子:

#include"stdio.h"
char * func()
{
    char * X=new char[10];
    X[0]='C';
    x[1]='\0';
    return X;//is it a good return from function?
}
main()
{
    char * A=func();
    puts(A);
    delete[] A;
}
Run Code Online (Sandbox Code Playgroud)

ste*_*anv 8

正如其他人已经指出的那样,从技术上讲,代码是可以的。
然而,代码的真正问题是函数签名char * func()。它只指定它将返回一个指向字符的指针。该指针可以是

  • 一个指向 char 变量的普通指针
  • 指向字符数组的指针
  • 指向 c 样式字符串的指针

指针可以指向

  • 静态记忆
  • 堆分配的内存将在其他地方释放
  • 您应该释放自己的堆分配内存。

除非您想信任文档或调查可能的大量代码(函数调用函数调用函数......),否则无法知道该怎么做。

这可以通过返回来避免

  • 一个字符
  • 一个 std::string
  • 一个容器
  • 一个智能指针。

手动内存管理很难在一个完整的应用程序中正确完成,永远不应成为您的主要关注点,因此应该避免它,而不是被返回指针的函数隐藏。