c++ - 是否有一个分配器使用 alloca 并且在其他方​​面与 C++ STL 兼容?

标签 c++ stl stack allocator alloca

我有两个问题:

1) 是否有可能实现一个分配器,它使用 alloca 在堆栈上分配内存并且在其他方​​面与 C++ STL 兼容?

如果那里有代码,您只需将 URL 指向我就可以让我高兴。 :-) 如果那里没有代码,也许您可​​以勾勒出分配和解除分配的函数?

2) 如果上述问题的答案是"is",我想了解如何在堆栈上为类成员分配内存。例如,考虑一个

std::vector<int, AllocaAllocator<int> > 

并假设调用此 vector 的成员函数“resize”首先调用分配器的“deallocate”,然后调用“allocate”。

调用 allocate 的范围是成员函数 resize 的范围。这是否意味着分配的内存在该函数调用结束时从堆栈中删除?

亲切的问候, 比约恩

最佳答案

Bjoern,看来您从根本上误解了堆栈和分配的工作原理。了解它们。

你问的是不可能的,因为当你从分配它的函数返回时,alloca 分配的内存被“释放”(不像帕特里克说的那样,内联不能改变它的行为)。我写“释放”是因为它实际上并没有被释放,它只是像任何其他堆栈变量一样超出了范围。所以之后使用它会导致未定义的行为。

假设您在 YourAllocator::allocate 中分配了一 block 内存,这是从 d.push_back() 调用的:

deque<int, AllocaAllocator> d;
d.push_back(42); // calls alloca
printf("Hello\n");
printf("%d\n", d[0]);

alloca分配的内存可能会被push_backprintf的栈帧覆盖,所以输出可能不是42,可能会崩溃,或者其他任何

关于c++ - 是否有一个分配器使用 alloca 并且在其他方​​面与 C++ STL 兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4082532/

相关文章:

c++ - 在另一个结构中释放一个结构内的指针

android - C++ 服务器使用 TCP 向 Android 客户端发送消息

c++ - 如何使用 std::ostringstream 截断整型的宽度?

c++ - std::map 排序谓词按字符串大小排序但保留不同的字符串?

java - 如何修改抽象数据类型(ADT)堆栈?

x86 - 我可以从堆栈中弹出一个值,但将它放在 NASM Assembly 的任何地方吗?

c++ - VC++ Glew 外部链接错误

c# - 创建具有完全信任权限(包括网络权限)的托管 CLR AppDomain

c++ - C++ 容器的一般用例

c++ - "top"值不会改变我推送或弹出堆栈的次数