如果通过重载`new []`分配给`malloc`来分配`free`内存是否安全?

vso*_*tco 10 c++ memory memory-management c++11

我的问题不是重复吗?`new`分配的`free()`内存是否安全?.

我正在为POD写一个玩具垃圾收集器,我正在定义我自己的定制operator new/new[]operator delete/delete[].代码如下:

#include <iostream>
#include <map>

std::map<void*, std::size_t> memory; // globally allocated memory map
struct collect_t {} collect; // tag for placement new

void* operator new(std::size_t size, const collect_t&)
{
    void* addr = malloc(size);
    memory[addr] = size;
    return addr;
}

void* operator new[](std::size_t size, const collect_t&) 
{
    return operator new(size, collect);
}

void operator delete(void *p, const collect_t&) noexcept
{
    memory.erase(p); // should call ::operator delete, no recursion
    free(p);
}

void operator delete[](void *p, const collect_t&) noexcept
{
    operator delete(p, collect);
}

void display_memory()
{
    std::cout << "Allocated heap memory: " << std::endl;
    for (auto && elem : memory)
    {
        std::cout << "\tADDR: " << elem.first << " "
                  << "SIZE: "  << elem.second << std::endl;
    }
}

void clear()
{
    for (auto && elem : memory)
        free(elem.first); // is this safe for arrays?
    memory.clear();
}

int main()
{
    // use the garbage collector
    char *c = new(collect) char; 
    int *p = new(collect) int[1024]; // true size: sizeof(int)*1024 + y (unknown overhead)

    display_memory();
    clear();
    display_memory();
}
Run Code Online (Sandbox Code Playgroud)

这个想法很简单:我将所有分配的跟踪地址(用我的自定义分配的地址new)存储在a中std::map,并确保在一天结束时清除我clear()函数中的所有内存.我用一个标签为我newdelete(和不超载全球的),这样std::map的分配可以拨打全球那些没有复发.

我的问题如下:在我的clear()函数中,我在行中取消分配内存

for (auto && elem : memory)
    free(elem.first); // is this safe for arrays?
Run Code Online (Sandbox Code Playgroud)

这对阵列是否安全,例如int *p = new(collect) int[1024];?我相信,自void* operator new[](std::size_t size, const collect_t&)呼叫operator new(size, collect);以及后者呼叫malloc.我不是百分百肯定,这里可能出问题吗?

Mar*_*k B 2

在我看来,为了让内存位于memory容器中,必须使用始终调用的自定义分配器来分配内存malloc。因此我相信你的代码调用 free 应该没问题。

显然,如果有人将随机地址填充到内存映射中,您最终会遇到各种未定义的行为。