Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多态放置对象上的析构函数_C++_C++11_Placement New_Virtual Destructor - Fatal编程技术网

C++ 多态放置对象上的析构函数

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

如果对象是使用placement new创建的多态类型,是否有方法对其调用析构函数

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]/2
base->~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
适用于其他对齐要求