【发布时间】:2021-10-28 18:02:09
【问题描述】:
所以,例如我有这个功能:
char* retCharPtr(void) {
char data[15] {"Data is here"};
return data; }
和
char* retCharPtr1(void) {
char *data = new char[15];
strcat(data, "Data is here");
return data; }
如果std::cout << retCharPtr1();,请说明数据数组将放置在哪里,
如果std::cout << retCharPtr();怎么办?
一般来说,当函数返回它们的状态(int)时,变量的值到哪里去了,它没有存储在任何地方。这 4 个字节在程序的完整执行过程中是否被占用?
我需要该函数为cout 返回一个数组,而无需下一次调用delete,并在内存中泄漏。
【问题讨论】:
-
@RemyLebeau retCharPtr() 表现出未定义的行为。 |是不是因为函数完成后会删除数据数组,返回的地址指向清空的内存?
-
这是一个非常危险的未定义行为,因为编译器为
retCharPtr选择的可能行为看起来在很多时候都有效。一个好的编译器会警告你不要这样做,因为它明显不起作用的时候可能是你真正需要它工作的时候。 -
我不认为这是一个 C++ 问题(C 风格编码和询问实现定义的行为)。 AFAIK 标准没有指定返回值的放置位置。如果它们被丢弃,那么无处可去。你可以去挖掘生成的程序集,在你给定的机器/编译器上找到答案
-
@VladyslavRehan
retCharPtr的堆栈帧将在返回时被销毁(及其所有内容)。现在,这是在汇编中实现为leave(据我所知,这将把内存留在那里),还是将内存返回给内核 C++ 没有指定。编译器可以做任何事情,而你正在访问你不应该访问的内存 -
自从您询问 last question 以来,处理此问题的正确方法没有改变。
标签: c++ arrays function pointers memory