C++ 多态放置对象上的析构函数
如果对象是使用placement new创建的多态类型,是否有方法对其调用析构函数C++ 多态放置对象上的析构函数,c++,c++11,placement-new,virtual-destructor,C++,C++11,Placement New,Virtual Destructor,如果对象是使用placement new创建的多态类型,是否有方法对其调用析构函数 class AbstractBase{ public: ~virtual AbstractBase(){} virtual void doSomething()=0; }; class Implementation:public virtual AbstractBase{ public: virtual void doSomething()override{ std::c
class AbstractBase{
public:
~virtual AbstractBase(){}
virtual void doSomething()=0;
};
class Implementation:public virtual AbstractBase{
public:
virtual void doSomething()override{
std::cout<<"hello!"<<std::endl;
}
};
int main(){
char array[sizeof(Implementation)];
Implementation * imp = new (&array[0]) Implementation();
AbstractBase * base = imp; //downcast
//then how can I call destructor of Implementation from
//base? (I know I can't delete base, I just want to call its destructor)
return 0;
}
类抽象库{
公众:
~virtual AbstractBase(){}
虚空doSomething()=0;
};
类实现:公共虚拟抽象库{
公众:
虚拟void doSomething()重写{
std::coutOverkill答案:使用unique\u ptr
和自定义删除器
struct placement_delete {
template <typename T>
void operator () (T* ptr) const {
ptr->~T();
}
};
std::aligned_storage<sizeof(Implementation)>::type space;
std::unique_ptr<AbstractBase,placement_delete> base{new (&space) Implementation};
struct placement\u delete{
模板
void运算符()(T*ptr)常量{
ptr->~T();
}
};
std::aligned_storage::type space;
std::unique_ptr.过度杀戮回答:使用unique_ptr
和自定义删除器
struct placement_delete {
template <typename T>
void operator () (T* ptr) const {
ptr->~T();
}
};
std::aligned_storage<sizeof(Implementation)>::type space;
std::unique_ptr<AbstractBase,placement_delete> base{new (&space) Implementation};
struct placement\u delete{
模板
void运算符()(T*ptr)常量{
ptr->~T();
}
};
std::aligned_storage::type space;
std::unique_ptr.base->~AbstractBase()
,或imp->~Implementation()。你选择。这甚至不是有效的C++。你可以<代码>删除BASE< /COD>,这将调用派生的虚拟析构函数。你确定你想在这里使用虚拟继承吗?是的,你是对的!谢谢!凯西的解决方案已经足够了:)不能保证<代码>数组< /C> >正确对齐以存储<代码>实现定位
-使用std::aligned_storage::type
代替char[sizeof(实现)]
@Aesthete调用delete base
将调用未定义的行为:“在第一个备选方案中(删除对象),则delete
的操作数的值可以是空指针值、指向由以前的新表达式创建的非数组对象的指针,或指向表示此类对象基类的子对象(1.8)的指针(第10条)。如果不是,则行为未定义。“[expr.delete]/2base->~AbstractBase()
,或imp->~Implementation()。你选择。这甚至不是有效的C++。你可以<代码>删除BASE< /COD>,这将调用派生的虚拟析构函数。你确定你想在这里使用虚拟继承吗?是的,你是对的!谢谢!凯西的解决方案已经足够了:)不能保证<代码>数组< /C> >正确对齐以存储<代码>实现定位
-使用std::aligned_storage::type
代替char[sizeof(实现)]
@Aesthete调用delete base
将调用未定义的行为:“在第一个备选方案中(删除对象),删除操作数的值可以是空指针值、指向由以前的新表达式创建的非数组对象的指针,或指向表示此类对象基类的子对象(1.8)的指针(第10条)。如果不是,则行为未定义。“[expr.delete]/2我认为您应该提供对齐作为aligned\u storage
的第二个参数。不过,这似乎不是必需的。例如:std::aligned\u storage::type
lol!您读到了我的心思,我需要它,正是为了与唯一的\u Ptr deleter Casey一起使用它:p@DyP对齐存储的第二个参数-对齐-有一个神奇的de“任何大小不大于第一个参数的C++对象类型的最严格对齐要求”的错误(第20.7.7.6表57)也就是说,malloc
和的对齐方式相同::operator new
在分配该大小时将使用。malloc
使用16。这对于AVX类型来说是不够的。因此,\u aligned\u malloc
存在于其他对齐要求中。我认为应该提供对齐方式作为aligned\u存储的第二个参数。但这似乎不是必需的。例如:std::aligned_storage::type
lol!你读到了我的心思,我正是为了与一个独特的\u Ptr deleter Casey一起使用它才需要它的:p@DyP对齐存储的第二个参数-对齐-具有神奇的默认值“任何大小不大于第一个参数的C++对象类型的最严格的对齐要求”(第20.7.7.6表57)也就是说,malloc
和使用的相同对齐方式::operator new
在分配该大小时将使用。malloc
使用16。这对于AVX类型来说是不够的。因此,\u aligned\u malloc
适用于其他对齐要求