当我们从函数返回时,如果返回值是指针,则必须将其定义为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}}
答案 0 :(得分:4)
正如其他人已经指出的那样,技术上,代码还可以
但是,代码的真正问题是函数签名char * func()
。
它只指定它将返回一个指向char的指针。该指针可以是
指针可以指向
除非你想要信任文档或调查可能的大量代码(函数调用函数调用函数......),否则无法知道该怎么做。
返回
可以避免这种情况手动内存管理很难在完整的应用程序中完成,并且永远不应该成为您的主要关注点,因此应该避免它并且不会被返回指针的函数隐藏。
答案 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
}