当对象作为引用

时间:2017-06-02 18:15:40

标签: c++ memory-management dynamic-memory-allocation

我在main中有以下代码:

void *pmemory;
pmemory = malloc(ONEGIG_SIZE);
PoolAllocator* poolAllocator =  new PoolAllocator(sizeof(Obj), __alignof(Obj), ONEGIG_SIZE, pmemory);


Obj *obj1 = allocator::allocateNew(*poolAllocator, Obj("Temp"));
allocator::deallocateDelete(*poolAllocator, obj1);

deallocateDelete()方法中的代码如下:

template<class T> void deallocateDelete(Allocator& allocator, T& object)
{
    object.~T();
    allocator.deallocate(&object);
}

我注意到如果我将T对象作为引用传递给deallocateDelete()方法,则以下行(对象.~T();)不起作用,我的意思是不会调用析构函数。但是如果我将参数更改为指针T *对象,则会调用析构函数。任何人都可以解释我为什么会这样?

1 个答案:

答案 0 :(得分:0)

  

我的意思是析构函数不被称为

实际上,析构函数在技术上被称为。只是T的析构函数是微不足道的,所以无法观察它的调用。

我怀疑您认为TObj。但事实并非如此:您传递给函数的对象是Obj*,因此推理的参数为Obj*&

要使用deallocateDelete参数调用Obj&,必须取消引用指针(就像取消引用指向分配器的指针一样):

allocator::deallocateDelete(*poolAllocator, *obj1);
//                                          ^