C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 如果通过重载“new []”分配给“malloc”,可以安全地释放内存吗?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我的问题不是 Is it safe to `free()` memory allocated by `new`?的重复.

我正在为POD编写一个玩具垃圾收集器,其中我定义了我自己的定制运算符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();
}

这个想法很简单:我将所有分配的跟踪地址(分配给我的自定义新的地址)存储在std :: map中,并确保在一天结束时清除我的clear()函数中的所有内存.我为我的新的和删除使用一个标签(并且不重载全局的),以便std :: map的分配器可以调用全局而不重复.

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

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

这对阵列是安全的,例如for int * p = new(collect)int [1024];?我相信是因void * operator new [](std :: size_t size,const collect_t&)调用operator new(size,collect);后者@L_880_10@malloc.我不是100%肯定的,可以吗?

解决方法

在我看来,为了让内存在你的内存容器中,它必须已经被分配给你的自定义分配器,它总是@L_880_10@malloc.所以我相信你的代码调用免费应该是可以的.

显然,如果有人在随机地址中填入随机地址到内存映射中,那么你将会遇到各种不确定的行为.

大佬总结

以上是大佬教程为你收集整理的c – 如果通过重载“new []”分配给“malloc”,可以安全地释放内存吗?全部内容,希望文章能够帮你解决c – 如果通过重载“new []”分配给“malloc”,可以安全地释放内存吗?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。