2011-03-30 81 views

回答

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'。

因为您已声明转换运算符的指针,所以能够A<int>类型的对象(一个反对A<int>*)上使用delete。采用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用来释放内存。

一般来说,当你想控制应该如何分配或释放该类的动态对象的内存时,只需定义这些操作符。

+0

谢谢理查德。是的,这就像我最后一个例子一样。我担心原则上可能存在模棱两可的情况:比如说有多个转换操作符返回指针。 – user2023370 2011-03-30 19:47:04

+0

如果你有多个转换操作符到一个指针类型,那么在对象上使用'delete'将是一个编译错误。 C++'11的FDIS表示:“操作数应该有一个指向对象类型的指针,或者是一个具有单个非显式转换函数(12.3.2)的类类型,指向对象类型的指针。 – 2011-04-19 18:12:55

5

您只需要定义运营商删除如果您定义运营商新 - 在这种情况下,你几乎必须这样做。

这并不意味着某些东西不需要删除您的A * - 但您不需要为此定义任何操作符,它将在默认情况下起作用。

2

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

+0

删除它的“析构函数”,是吗? – 2011-03-30 17:16:33

+0

@ Ernest:的确 - 固定的。 – 2011-03-30 17:17:56

+0

关于你的第二点,你在想'操作员'吗?重载“operator T *”不应该影响取对象的地址? – 2011-03-30 18:39:32

0

您是否需要定义一个隐式转换运算符?A真的需要定义一个隐式转换运算符吗?也许有一个简单的T* get() const方法返回指针,就像boost和std智能指针一样。隐式转换会造成各种麻烦。

相关问题