智能指针实现:何时为pointee调用析构函数?

时间:2013-01-24 15:42:32

标签: c++ c++11

我有以下代码,并使用智能指针包装Temple对象。我明白了 这个概念,但我不明白的是当被调用的对象的析构函数被调用时。

即便想到,我还没有实现~mySmartPointer,调用模板析构函数。

输出

  

Temple Constructor

     

调用指针访问运算符

     

- 欢迎圣殿

     

调用取消引用运算符

     

- 欢迎圣殿

     

Temple Destructor

     

析构函数已被调用

代码

#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();
}

3 个答案:

答案 0 :(得分:7)

T operator *() 

按值返回 - 它就是被销毁的副本。

如果您将其更改为

T& operator *() 

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

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

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

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

答案 1 :(得分:1)

这是引起混淆的代码。

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

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

将其更改为:

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

答案 2 :(得分:0)

这是因为您从operator*()返回了对象的副本

在这里查看返回类型:

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

您需要返回T&

最好为T const & operator*() const智能指针对象定义const