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

时间:2015-06-10 11:44:01

标签: c++ c pointers

当我们从函数返回时,如果返回值是指针,则必须将其定义为static。这对于堆内存分配指针(例如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; } 指针)也是如此吗?

考虑这个例子:

{{1}}

5 个答案:

答案 0 :(得分:4)

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

  • 指向char变量的普通指针
  • 指向char数组的指针
  • 指向c风格字符串的指针

指针可以指向

  • 静态记忆
  • 将在其他地方释放的堆分配内存
  • 堆积分配的内存,您可以自行释放。

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

返回

可以避免这种情况
  • 一个char
  • 一个std :: string
  • 一个容器
  • 智能指针。

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

答案 1 :(得分:1)

除了奇怪的增量/减量摆弄外,代码还可以。

当函数返回时,变量X超出范围,但这只是实际变量,而不是它指向的内容。

指针基本上是简单的整数,其内容恰好是内存中某处的地址,并由编译器专门处理。函数返回时发生的情况是变量超出范围之前复制变量X内容。然后再次复制内容的副本(实际内存地址),这次是调用函数中的变量A

答案 2 :(得分:1)

C ++不是垃圾回收。在X中的func()语句之前,delete [] A中的main()不会被取消分配。

具有递增和递减X的shenanigans不会更改它(除非它们导致X指向使用运算符new分配的内存之外,这将导致未定义的行为。)< / p>

答案 3 :(得分:1)

当你使用new分配内存时,它会从堆中分配内存,所以从任何其他函数返回它的指针都没有坏处。

要了解有关new()的更多信息,您可以转到此链接。 http://www.tutorialspoint.com/cplusplus/cpp_dynamic_memory.htm

答案 4 :(得分:1)

在您这样做之前,堆分配不会受到任何影响。但最好是释放分配它的内存(如果可能的话)。这可以防止内存泄漏。这可能如下所示:

#include"stdio.h"
void func(char *X)
{
    //I also think it Looks better to use it as an array
    X[0]='C';
    X[1]='\0';
}
main()
{
    char * A=new char[10];    //Allocate here
    func(A);
    puts(A);
    delete[] A;               //Deallocate here
}