【发布时间】:2015-03-05 18:12:15
【问题描述】:
理论上,如果内存中的空间是使用operator new 分配的,是否有可能以零碎的方式释放该内存?例如,如果使用void *mem = operator new(sizeof(int)*2) 将内存地址分配给两个int* 变量,一个在mem,另一个在mem+sizeof(int),是否可以释放其中一个的内存,但不能释放另一个?
据我了解operator new只分配内存,不调用任何构造函数,所以使用放置new在内存中精确空间调用构造函数。如果这些分配的内存地址是已知的,但在内存中不一定是线性的(例如,存储在内存池类的链表中),我想会有一种适当的方法来释放分配的内存遍历内存地址的链表并释放分配大小的内存。但是,通过将内存分配给指向适当大小的数据类型的指针,总是会引发运行时错误。
有合适的方法吗?
理论例子:
// This works fine
uintptr_t mem1 = reinterpret_cast<uintptr_t>(operator new(sizeof(int)));
int *a = new(reinterpret_cast<void*>(mem1)) int(1);
printf("a|*a\t\t%p|%d\n", a, *a);
delete a;
// Both of the pointers can be assigned to the appropriate positions...
uintptr_t mem2 = reinterpret_cast<uintptr_t>(operator new(sizeof(int) * 2));
int *b = new(reinterpret_cast<void*>(mem2)) int(2);
printf("b|*b\t\t%p|%d\n", b, *b);
int *c = new(reinterpret_cast<void*>(mem2+sizeof(int))) int(3);
printf("c|*c\t\t%p|%d\n", c, *c);
// ...but attempting to delete them results in a runtime error.
operator delete(b);
operator delete(c);
//using "operator delete(reinterpret_cast<void*>(mem2));" works just fine, but I'm operating on the assumption that the addresses may be non-linear, in a linked-list of addresses of a constant size
【问题讨论】:
-
@0x499602D2 分配,我的错。
-
不,这是不可能的。我想你可以制作一个自定义的分配器和释放器,但是为什么无缘无故地让你的生活复杂化呢?
-
@bolov 因为我决心完成这项工作。
标签: c++ memory memory-management memory-leaks