删除使用placement new分配的动态多态对象

时间:2016-01-10 23:18:09

标签: c++ polymorphism placement-new

有两个班级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 *>它包含对象A或对象B,如何正确地销毁向量中的所有元素?

问题是没有用于放置删除的删除表达式。我不能调用默认的删除表达式,因为我需要提供文件和行参数,所以我坚持直接调用操作符delete,我发现这样做不会调用对象的析构函数。我也无法显式调用析构函数,因为向量中的对象可以是A或B.

编辑

我试图做v[i]->~A();,但是即使向量中有B对象,也不会调用B的析构函数

我用这样的东西填充了矢量:

v[0] = new(__FILE__, __LINE__) A;
A* temp = new(__FILE__, __LINE__) B;
v[1] = temp;

谢谢

1 个答案:

答案 0 :(得分:0)

我相信你的问题可以简化。它减少了解决以下问题:给定

A * p = new ("foo", 1) A(/* args... */);
A * q = new ("bar", 2) B(/* args... */);

你如何释放所有依附所有权责任?

首先,您必须销毁对象:

p->~A();
q->~A();

感谢虚拟析构函数,这没问题。

现在你必须释放存储空间。你如何做到这一点取决于你的位置 - 新分配功能到底是什么!例如,如果您有:

void * operator new(std::size_t n, const char *, int)
{
    return std::malloc(n);
}

然后你必须使用std::free(p); std::free(q);释放内存。如果您的实现改为使用return ::operator new(n),那么您可以使用::operator delete(p)等等。如果您正在返回指向静态内存的指针,那么您就不必释放任何内容。< / p>

由于您是调用放置新分配函数的人,因此您需要知道如何清理!