Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 替换全局运算符new/delete并在其中分配内存,导致堆损坏_C++_Dynamic Memory Allocation - Fatal编程技术网

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); }