以下代码使用堆:
char* getResult(int length) {
char* result = new char[length];
// Fill result...
return result;
}
int main(void) {
char* result = getResult(100);
// Do something...
delete result;
}因此,result必须在某个地方删除,最好是由所有者删除。
据我所知,下面的代码使用了一个名为VLA的扩展,它是C99的一部分,而不是C++标准的一部分(但由GCC和其他编译器支持):
char* getResult(int length) {
char result[length];
// Fill result...
return result;
}
int main(void) {
char* result = getResult(100);
// Do something...
}在这种情况下,假设堆栈上仍然分配了result,我是否正确?
result是一个副本,还是对垃圾内存的引用?以上代码安全吗?
发布于 2013-09-12 17:57:40
在这种情况下,我是否正确地假设结果仍然分配在堆栈上?
对,是这样。VLA具有自动存储时间。
结果是副本,还是对垃圾内存的引用?以上代码安全吗?
密码不安全。getResult返回的地址是无效地址。删除指针会调用未定义的行为。
发布于 2013-09-12 17:57:31
您不能返回它,在C中它将具有自动存储持续时间(一旦离开作用域,该对象将无效),并且返回它将从对象的C99标准草案节6.2.4存储持续时间第6段调用6.2.4
对于这样一个具有可变长度数组类型的对象,它的生存期从对象的声明到程序的执行都会离开声明的作用域。27)如果递归地输入作用域,每次都会创建对象的一个新实例。对象的初始值是不确定的。
在C++中,我们必须依赖于文档,因为在这种情况下它是扩展,而gcc博士说,当作用域结束时,它将被解除分配:
这些数组像任何其他自动数组一样声明,但长度不是常量表达式。当包含声明的块作用域退出时,将在声明点分配存储空间。
发布于 2013-09-12 18:03:16
当您从getResult()返回时,char数组result将超出作用域并与函数调用的堆栈帧一起被解除分配。如果要保留函数结构,则必须调用malloc,然后释放内存。
https://stackoverflow.com/questions/18771165
复制相似问题