如果我有一个包含指针的模板类A
,并且A
有一个隐式转换运算符将返回该指针,我是否需要或应该定义{{1}如果我打算将delete
应用于此类的对象,那么A
的运算符是什么?
答案 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智能指针一样。隐式转换可能会导致各种麻烦。