小编Gwa*_*edd的帖子

全局"展示位置"删除[]

我试图用我自己的分配器替换new/delete.所以,重写新的和删除 - 非常满意.看起来像这样......

void* operator new( size_t size, Allocator* a )
{
    return a->Alloc( size );
}

template<class T> inline void MyDelete( T* p, Allocator* a )
{
    if( p )
    {
        p->~T();
        a->Free( p );
    }
}
Run Code Online (Sandbox Code Playgroud)

C++语言指定,对于放置删除,您必须显式调用~dtor.编译器不会为您执行此操作.这是一个模板化操作符删除还是显式函数如图所示.

http://www2.research.att.com/~bs/bs_faq2.html#placement-delete

问题是 - 我怎样才能使这个数组删除[]?我知道我需要遍历数组并自己调用~dtor.因此我需要数组的大小,

编辑清晰

我可以存储此信息或从块大小推断它.然而,问题是编译器(MSVC v9)做了不同的事情,如果我分配一个带有析构函数的对象数组与没有析构函数的对象相比,即如果有一个dtor它将分配额外的4个字节.这是因为标准delete []的编译器需要做同样的事情,并且可以为delete []配对相应的代码.

但是在我自己的"placement"中删除[]我无法知道编译器做了什么,或者如果类有一个dtor,则在编译时安全地确定.

例如

char buf[ 1000 ];

MyClass* pA = new( buf ) MyClass[ 5 ];
Run Code Online (Sandbox Code Playgroud)

这里pA的值是buf + 4,如果存在~MyClass()并且分配的内存量是sizeof(MyClass)*5 + 4.但是如果没有dtor那么pA == buf并且分配的内存量是sizeof(MyClass)*5.

所以我的问题是 - 这种行为是一种语言标准,并且在编译器中是一致的,还是MSVC特有的?还有其他人对这个问题有一个很好的解决方案吗?我想唯一的选择是不使用new []并自己进行构造,这很好,但调用代码语法有点不寻常..或强制每个类都有一个析构函数.

c++ visual-c++

9
推荐指数
1
解决办法
3040
查看次数

标签 统计

c++ ×1

visual-c++ ×1