在使用C++时,我必须询问一些关于堆栈与堆的语言语义。首先,当我们在堆栈上创建一个对象时,非常清楚它的生命周期有多长。一旦它退出{}作用域运算符,它就会被编译器处理并销毁。这很好。
当我们使用新关键字在堆上创建对象时,对象本身的动机太大,不能放在堆栈上。那么,为什么堆对象有不同的生命周期语义。突然,堆对象具有程序的生命周期,而不是本地范围。
现在,忽略这个智能指针以与堆栈对象一样的方式处理这些堆对象的所有权概念。当智能指针超出作用域时,它所指向的对象也是如此。
我要问的是,为什么给堆对象提供一个与堆栈对象不同的生命周期?
发布于 2022-08-16 11:18:28
它与尺寸无关。
堆对象的唯一目的是它们具有与堆栈对象不同的生命周期。有了堆,您可以在运行时动态地创建和销毁对象,只要您愿意。您可以将堆上的对象从一个块传递到另一个块,并将所有权传递给该不同的块,在该块中,有了堆栈对象,您将绑定到块的生存期。
发布于 2022-08-16 11:11:38
想象一下非常简单的函数,它为int数组分配内存,并将随机值设置为其元素。
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,因为该数组在函数作用域之外被访问:
int *createArray(size_t size)
{
int x[size];
for(size_t index = 0; index < size; index++) x[index] = rand();
return x;
}https://stackoverflow.com/questions/73372868
复制相似问题