首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >堆生命周期与堆栈生命周期不同的动机

堆生命周期与堆栈生命周期不同的动机
EN

Stack Overflow用户
提问于 2022-08-16 10:56:02
回答 2查看 68关注 0票数 1

在使用C++时,我必须询问一些关于堆栈与堆的语言语义。首先,当我们在堆栈上创建一个对象时,非常清楚它的生命周期有多长。一旦它退出{}作用域运算符,它就会被编译器处理并销毁。这很好。

当我们使用新关键字在堆上创建对象时,对象本身的动机太大,不能放在堆栈上。那么,为什么堆对象有不同的生命周期语义。突然,堆对象具有程序的生命周期,而不是本地范围。

现在,忽略这个智能指针以与堆栈对象一样的方式处理这些堆对象的所有权概念。当智能指针超出作用域时,它所指向的对象也是如此。

我要问的是,为什么给堆对象提供一个与堆栈对象不同的生命周期?

EN

回答 2

Stack Overflow用户

发布于 2022-08-16 11:18:28

它与尺寸无关。

堆对象的唯一目的是它们具有与堆栈对象不同的生命周期。有了堆,您可以在运行时动态地创建和销毁对象,只要您愿意。您可以将堆上的对象从一个块传递到另一个块,并将所有权传递给该不同的块,在该块中,有了堆栈对象,您将绑定到块的生存期。

票数 6
EN

Stack Overflow用户

发布于 2022-08-16 11:11:38

想象一下非常简单的函数,它为int数组分配内存,并将随机值设置为其元素。

代码语言:javascript
复制
int *createArray(size_t size)
{
    int *x = malloc(sizeof(*x) * size);
    if(x)
        for(size_t index = 0; index < size; index++) x[index] = rand();
    return x;
}

调用方可以使用此数组,因为其生存期不限于函数范围。

如果我修改它以使用自动存储持续时间数组,如果调用方试图使用返回的引用,它将调用UB,因为该数组在函数作用域之外被访问:

代码语言:javascript
复制
int *createArray(size_t size)
{
    int x[size];
    for(size_t index = 0; index < size; index++) x[index] = rand();
    return x;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73372868

复制
相关文章

相似问题

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