分配的内存和数组
你好所以我正在试验用预先分配的内存创建对象和数组。 例如,我有以下代码:
int * prealloc = (int*)malloc(sizeof(Test));
Test *arr = new(prealloc) Test();
测试定义如下:
class Test {
public:
Test() {
printf("In Constructorn");
}
~Test() {
printf("In Destructorn");
}
int val;
};
在这种情况下,如果我调用删除它实际上会释放内存不好,B / C也许我正在使用某种类型的内存管理器,所以这肯定会导致一些问题。 我在互联网上搜索,我发现的唯一解决方案是明确调用析构函数,然后调用free:
arr->~Test();
free(arr);
有没有另一种方法来做到这一点? 有没有办法调用delete并告诉它只调用析构函数而不释放内存?
我的第二个问题是使用数组时,像上一个例子,您可以传递给新的预分配内存:
int * prealloc2 = (int*)malloc(sizeof(Test) * 10);
Test *arr2 = new(prealloc2) Test[10];
如果我调用delete[]
它不仅会调用数组中每个元素的析构函数,还会释放我不想要的内存。 我发现应该完成的唯一方法是通过数组并明确调用析构函数,然后自由调用。 与常规的无数组操作符一样,有没有办法告诉操作员在不释放内存的情况下调用析构函数?
我注意到的一件事是,数组的新运算符实际上会使用前4个字节来存储数组的大小(我只在32位版本的Visual Studio中测试过)。这将帮助我知道有多少元素数组有,但仍然有一个问题。 如果数组是一个指针数组呢? 例如:
Test **arr2 = new Test*[10];
请有人帮我解决这些问题。
这是正常的,并期望直接调用析构函数来销毁您使用placement new创建的对象。 至于任何其他的做事方式,唯一明显的选择是使用一个Allocator对象(至少99%的时间将只是一个新的包装器,直接调用析构函数)。
一般来说,你根本不想使用new[]
。 您通常希望为operator new
(或可能是::operator new
)分配原始内存,并使用匹配的operator delete
或::operator delete
释放它。
您可以使用新的位置在该内存中创建对象,并通过直接调用析构函数来销毁它们。
除此之外,没有其他的方法可以做到这一点,因为删除也会试图释放内存。
在代码中使用预先分配的内存以及新的代码应该相当罕见 - 典型的用例是当你想要/需要在固定内存地址上映射对象时处理直接内存映射硬件接口 - 并且是某种东西我通常会考虑代码味道。
如果你想调整某个特定类的内存管理,那么使用带有自定义分配器的STL容器或者为该特定类重载运算符new和delete会更好。
是的,这是做到这一点的唯一方法。 被允许定义new
但不delete
是不对称的。 [那么,你可以做后者,但只能在new
引发异常时调用(在下面没有正确处理!)
您可以使用模板化destroy
来实现相同的结果:
class Test
{
public:
Test() {
printf("In Constructorn");
}
~Test() {
printf("In Destructorn");
}
int val;
};
class Allocator
{
public:
static void* allocate(size_t amount) { return std::malloc(amount);}
static void unallocate(void* mem) { std::free(mem);}
static Allocator allocator;
};
Allocator Allocator::allocator;
inline void* operator new(size_t size, const Allocator& allocator)
{
return allocator.allocate(size);
}
template<class T>
void destroy(const Allocator& allocator, T* object)
{
object->~T();
allocator.unallocate(object);
}
int main()
{
Test* t = new (Allocator::allocator) Test();
destroy(Allocator::allocator, t);
return 0;
}
链接地址: http://www.djcxy.com/p/73035.html