0

我有下面的代码,并用Temple智能指针包装了对象。我理解了这个概念,但我不明白的是何时调用了持有对象的析构函数。

甚至想,我还没有实现~mySmartPointer,模板析构函数被调用了。

输出

寺庙建造者

调用指针访问运算符

——迎宾寺

调用取消引用运算符

——迎宾寺

神殿破坏者

调用析构函数

代码

#include <iostream>
using namespace std;

template <typename T>
class mySmartPointer 
{
private:
    T *_object;    
public: 
    explicit mySmartPointer(T * newObject) {
       _object = newObject;
    };
    ~mySmartPointer() { cout <<"Destructor is Invoked "<<endl;}; 

    T operator *() {
        cout  <<" Invoking De-referencing Operator "<<endl;
        return * _object;
    };

    T * operator ->() {
        cout <<"Invoking pointer access operator "<<endl;
        return _object;
    };
};

class Temple
{
private:
    int x,y;
public:
    void printWelcome() {
        cout <<"-- Welcome Temple "<<endl;
    }
    Temple() {
        cout <<"Temple Constructor"<<endl;
    }
    ~Temple() {
        cout <<"Temple Destructor "<<endl;
    }
};

int main(int argc, char ** argv) {
    mySmartPointer<Temple> t (new Temple);
    t->printWelcome();      
    (*t).printWelcome();
}
4

3 回答 3

7

这个

T operator *() 

按值返回 - 正是那个副本被破坏了。

如果您将其更改为

T& operator *() 

你会看到它没有被调用的对象的析构函数。请注意,这应该有两个版本:

T const& operator *() const;
T& operator *() 

和类似的operator->。这样您就可以在对象上调用const方法。const

如果您出于教育目的这样做,那很好,否则请使用现有实现之一。

于 2013-01-24T15:44:52.243 回答
1

这是导致混乱的代码。

  T operator *() 
  {
      cout  <<" Invoking De-referencing Operator "<<endl;
      return * _object;
  };

当您调用此代码时,会创建一个Temple 副本。此副本将自动销毁。

将其更改为:

  T& operator *() 
  {
      cout  <<" Invoking De-referencing Operator "<<endl;
      return * _object;
  };
于 2013-01-24T15:48:26.380 回答
0

这是因为您要从.operator*()

看看这里的返回类型:

T operator *() 
{
     cout  <<" Invoking De-referencing Operator "<<endl;
     return * _object;
};

您需要返回T&

如果你T const & operator*() const 也为const智能指针对象定义更好!

于 2013-01-24T15:46:22.293 回答