C++ 替换全局运算符new/delete并在其中分配内存,导致堆损坏
从分配器分配C++ 替换全局运算符new/delete并在其中分配内存,导致堆损坏,c++,dynamic-memory-allocation,C++,Dynamic Memory Allocation,从分配器分配n“东西”而不是n字节。您应该更改: allocations_map& get_allocations_map() { static allocations_map* allocations_ptr = nullptr; if (allocations_ptr == nullptr) { allocations_ptr = (allocations_map*) malloc(sizeof(allocations_map));
n
“东西”而不是n
字节。您应该更改:
allocations_map& get_allocations_map()
{
static allocations_map* allocations_ptr = nullptr;
if (allocations_ptr == nullptr)
{
allocations_ptr = (allocations_map*) malloc(sizeof(allocations_map));
allocations_ptr = new(allocations_ptr)allocations_map;
}
return *allocations_ptr;
}
allocations_map& get_allocations_map()
{
static allocations_map allocations;
return allocations;
}
致:
为什么我要损坏分配的构造函数中的堆
因为存储在该映射中的元素的构造函数访问分配的内存超出范围。这看起来像。来自其他转换单元的全局成员和静态成员可能在
分配之前初始化。当这些对象尝试新建时,表达式allocations.emplace(p,n)代码>使用未初始化的对象。您可以尝试为分配使用而不是全局对象来解决此问题。不确定这是否是问题的一部分,但您只为占用的n
int
s分配n
字节(取决于您的系统)可能是20到40字节。在线程化环境中使用此解决方案时也应小心。地图未同步。我很好奇是否需要在单个线程上进行静态初始化。@FrançoisAndrieux谢谢,我将测试singleton方法,您的解释听起来不错。真正的代码当然包括锁定。@Eljay它在wandbox中不起作用。本地使用VS.谢谢,愚蠢的我。。。解决了的。关于静态初始化顺序的评论也是一个可能的bug,所以至少我学到了比bug修复更多的东西;)
allocations_map& get_allocations_map()
{
static allocations_map* allocations_ptr = nullptr;
if (allocations_ptr == nullptr)
{
allocations_ptr = (allocations_map*) malloc(sizeof(allocations_map));
allocations_ptr = new(allocations_ptr)allocations_map;
}
return *allocations_ptr;
}
allocations_map& get_allocations_map()
{
static allocations_map allocations;
return allocations;
}
T* allocate(std::size_t n) const { return (T*)malloc(n); }
T* allocate(std::size_t n) const { return (T*)malloc(sizeof(T) * n); }