【发布时间】:2016-04-15 04:42:18
【问题描述】:
有两个类A&B,B派生自A。A&B有虚析构函数。我还有两个放置新功能:
void* operator new (std::size_t size, const char* file, int line)
void* operator new[](std::size_t size, const char* file, int line)
和两个放置删除功能:
void operator delete (void* p, const char* file, int line)
void operator delete[](void* p, const char* file, int line)
问题是,如果我有包含对象 A 或对象 B 的向量,我如何正确销毁向量中的所有元素?
问题是放置删除没有删除表达式。我不能调用默认的删除表达式,因为我需要提供文件和行参数,所以我坚持直接调用运算符删除,我刚刚发现这样做不会调用对象的析构函数。我也不能显式调用析构函数,因为向量内的对象可能是 A 或 B。
编辑:
我尝试做v[i]->~A();,但即使向量中有一个 B 对象,也没有调用 B 的析构函数
我用这样的东西填充了向量:
v[0] = new(__FILE__, __LINE__) A;
A* temp = new(__FILE__, __LINE__) B;
v[1] = temp;
谢谢
【问题讨论】:
-
当您使用虚拟析构函数手动调用基类指针上的析构函数时,我很确定它会正确地动态调度。
-
向量不能包含 A 或 B。向量只能包含一种类型的元素。
-
@KerrekSB 似乎 stackoverflow 无法正确显示矢量。我写了vector,但它显示了vector。不知道为什么
-
使用你的编辑能力,卢克。帮助中心有关于 Stack Overflow 的 markdown 语法的文档,实时预览让您在提交问题之前验证它是否符合预期...
-
请显示有关如何填充向量的代码。
标签: c++ polymorphism placement-new