首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回VLA安全吗?

返回VLA安全吗?
EN

Stack Overflow用户
提问于 2013-09-12 17:54:42
回答 3查看 388关注 0票数 2

以下代码使用堆:

代码语言:javascript
复制
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和其他编译器支持):

代码语言:javascript
复制
char* getResult(int length) {
    char result[length];
    // Fill result...
    return result;
}

int main(void) {
    char* result = getResult(100);
    // Do something...
}

在这种情况下,假设堆栈上仍然分配了result,我是否正确?

result是一个副本,还是对垃圾内存的引用?以上代码安全吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-12 17:57:40

在这种情况下,我是否正确地假设结果仍然分配在堆栈上?

对,是这样。VLA具有自动存储时间。

结果是副本,还是对垃圾内存的引用?以上代码安全吗?

密码不安全。getResult返回的地址是无效地址。删除指针会调用未定义的行为。

票数 6
EN

Stack Overflow用户

发布于 2013-09-12 17:57:31

您不能返回它,在C中它将具有自动存储持续时间(一旦离开作用域,该对象将无效),并且返回它将从对象的C99标准草案6.2.4存储持续时间第6段调用6.2.4

对于这样一个具有可变长度数组类型的对象,它的生存期从对象的声明到程序的执行都会离开声明的作用域。27)如果递归地输入作用域,每次都会创建对象的一个新实例。对象的初始值是不确定的。

在C++中,我们必须依赖于文档,因为在这种情况下它是扩展,而gcc博士说,当作用域结束时,它将被解除分配:

这些数组像任何其他自动数组一样声明,但长度不是常量表达式。当包含声明的块作用域退出时,将在声明点分配存储空间。

票数 5
EN

Stack Overflow用户

发布于 2013-09-12 18:03:16

当您从getResult()返回时,char数组result将超出作用域并与函数调用的堆栈帧一起被解除分配。如果要保留函数结构,则必须调用malloc,然后释放内存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18771165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档