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()函数中的所有内存.我用一个标签为我new和delete(和不超载全球的),这样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.我不是百分百肯定,这里可能出问题吗?
在我看来,为了让内存位于memory容器中,必须使用始终调用的自定义分配器来分配内存malloc。因此我相信你的代码调用 free 应该没问题。
显然,如果有人将随机地址填充到内存映射中,您最终会遇到各种未定义的行为。
| 归档时间: |
|
| 查看次数: |
206 次 |
| 最近记录: |