首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >常量字符的_alloca和std::vector *

常量字符的_alloca和std::vector *
EN

Stack Overflow用户
提问于 2021-09-14 21:37:52
回答 1查看 58关注 0票数 1

我对_alloca函数进行了多次搜索,通常不推荐使用它。我将拥有一个动态更新的字符串数组,我将不得不经常对其进行迭代。我希望在堆栈上分配每个字符串,以尽可能减少未命中缓存。

使用_alloca,我可以在堆栈上创建一个char*并将其放入向量中。我的字符将在一个向量中,它不会影响我的堆栈,我知道当我在堆栈上分配它们时,字符串永远不会足够大,不会造成堆栈溢出。

在这种情况下使用它是一件坏事吗?

程序是否做了我想让它做的事情?

代码语言:javascript
复制
#include <vector>
#include <cstring>

#ifdef  __GNUC__
# define _alloca(size) __builtin_alloca (size)
#endif /* GCC.  */

std::vector<const char*> vec;

void add(const char* message, int size) {
  char* c = (char*) _alloca (size * sizeof(char*));
  std::memcpy(c, message, sizeof(message));
  vec.push_back(c);
}

int main() {
  const char* c = "OK";
  for (int i = 0; i < 10; ++i) {
    add(c, 2);
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-14 22:00:00

当调用_alloca的函数返回时,由_alloca分配的堆栈内存将自动释放。指向它的指针被推到某个地方(特别是某个向量)并不能阻止内存被释放(正如你在评论中提到的那样),这不是C++的工作方式。在C++中没有“垃圾回收”。

因此,所显示的代码最终存储了一个指向释放的堆栈内存的指针。一旦add()返回,就会留下一个悬空指针,随后使用它会导致未定义的行为。

换句话说:是的,“在这种情况下使用它是一件坏事”,因为所显示的代码将无法工作。

这个特定的_alloca调用还有其他几个主要问题,但这不是重点。即使这些问题得到了正确的修复,整个方法也会失败。

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

https://stackoverflow.com/questions/69184772

复制
相关文章

相似问题

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