如果我有运算符T *(),是否需要重载删除?

时间:2011-03-30 16:56:05

标签: c++ operator-overloading

如果我有一个包含指针的模板类A,并且A有一个隐式转换运算符将返回该指针,我是否需要或应该定义{{1}如果我打算将delete应用于此类的对象,那么A的运算符是什么?

4 个答案:

答案 0 :(得分:5)

如果你定义 operator new ,你只需要定义 operator delete - 在这种情况下你几乎必须这样做。

这并不意味着某些东西不需要删除你的A * - 但是你不需要为此定义任何操作符,它将默认工作。

答案 1 :(得分:2)

如果你的类拥有这个指针,它应该在它的析构函数中删除它。请注意,重载此运算符可能会造成混淆,因为获取指向对象的指针的常用方法是获取其地址。

答案 2 :(得分:2)

我相信你有类似的东西:

template <typename T>
struct A {
  T * t;
  operator T* () { return t; } 
};

你打算“将delete应用于这个类的对象”,所以我假设你的意思是:

void foo ()
{
  A<int> * p = new A<int>;
  delete p;     // Applying 'delete'
}

如果是这种情况,那么正确删除调用会破坏对象并释放前一行使用“new”分配的内存,并且问题的答案为“no”。

因为您已经向指针声明了转换运算符,所以可以在delete类型的对象上使用A<int>(与A<int>*相对)。使用delete将应用于调用转化运算符的结果:

void foo ()
{
  A<int> a;
  a.t = new int;
  delete a;       // Same as: delete a.operator T*()
}

删除工作原理的基础知识:

表达式delete p执行两个不同的操作。首先,它调用p指向的对象的析构函数,然后释放内存。如果为您的类定义operator delete成员,那么delete p将使用该函数来释放内存。

通常,只有在想要控制应该如何分配或释放该类的动态对象的内存时,才定义这些运算符。

答案 3 :(得分:0)

您是否真的<{1}} 需要定义一个隐式转换运算符?也许有一个简单的A方法返回指针,就像boost和std智能指针一样。隐式转换可能会导致各种麻烦。