alloca() 可以替代 C++ 中的自动指针吗?

Posted

技术标签:

【中文标题】alloca() 可以替代 C++ 中的自动指针吗?【英文标题】:Can alloca () be replacement for auto pointers in C++? 【发布时间】:2014-07-03 12:56:29 【问题描述】:

alloca () 用于从堆栈分配内存,堆栈在到达作用域末尾时自动释放。同时,C++ 中的自动指针确保在堆栈缠绕期间自动释放堆中动态分配的内存。

说 alloca() 提供了与自动指针提供的类似的自动回收功能是否正确?

【问题讨论】:

你的前提是错误的。 alloca 分配的内存在周围的函数结束时被释放。 alloca 不可移植,它既不是 C、POSIX 也不是任何其他标准的一部分,它依赖于编译器。应避免使用它。当然,即使在函数结束时“自动”地未分配内存,它也不会(就像malloc)在分配/释放时调用任何构造函数或析构函数。 【参考方案1】:

不,一点也不,那是完全错误的。 C++ 中智能指针(unique_ptrshared_ptr 和旧的和已弃用的auto_ptr)的目的是在空闲存储上拥有内存分配,即用new 分配的对象(尽管有一些灵活性)。供应商特定的alloca 在调用堆栈上分配内存(不是对象),而不是在空闲存储上。

标准中与alloca 最接近的类似物是C 的可变长度数组,但C++ 甚至没有。即使这样,语义也不同,因为 C 和 C++ 中的名称是有作用域的,但 alloca 的语义并没有系统地与作用域相关联(而是与 函数 相关联)。如果您愿意,可以将alloca 视为提供“动态大小的局部变量”,但这种类比存在许多缺陷。

【讨论】:

以上是关于alloca() 可以替代 C++ 中的自动指针吗?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在 c++20 协程中使用 alloca() 或可变长度数组扩展吗?

在 C 中模拟 `alloca()`

构造一个指向 alloca 的函数指针会导致链接器错误?

返回分配指针

复合语句中的 alloca

alloca() 如何在内存级别上工作?