智能指针的显式转换为指针类型的原始指针。

时间:2013-02-21 09:49:47

标签: c++

很抱歉,如果这是一个非常基本的问题,我正在尝试运行以下程序,我收到了分段错误。

我的理解是什么?

有一个函数proc(t),其中t通过运算符T 连接到T *。因此,在执行proc(t)函数时,我们将有一个指向T 的指针类型,并且调用display()函数是合法的。

我想要什么?

1)我犯了哪个错误?。

2)我的理解是否正确?

#include <iostream>

using namespace std;

template <typename T>
class sPtr
{
    private:
       T * __pointee;
     public:

        operator T * () {
                cout <<"Inside T* () "<<endl;
        };
    explicit sPtr ( T * t )
    {

      __pointee = t;
    };
    T * operator->() {
        return __pointee;
     }
};

class JTest
{
 private:
        int x;
 public:
   JTest ( int l=100) { x=l; };
    void display ();
};

void JTest::display()
{
  cout <<"Display API x is "<<x<<endl;
}

void proc (JTest * tmp)
{
  cout <<" proc"<<endl;
  tmp->display ();
  cout <<"Invoking JTest -> display "<<endl;
}


int main ( int argc, char ** argv)
{
 sPtr <JTest> t(new JTest);
 t->display();
 proc(t);   // Invokes operator T*().

}

1 个答案:

答案 0 :(得分:2)

你的operator T*()缺少一个return语句,所以它显然返回一个垃圾值(一个指向内存中随机位置的指针),并解除引用这个指针而不是段错误。

为什么你的编译器没有错误,这超出了我的范围。