0

演算子 T*() から pointee 型を返し、スマート ポインターに対して削除演算子を呼び出し、メンバー関数を呼び出してみましたが、実行時エラーは発生していません。そんなことがあるものか?それとも私の理解が間違っていますか?よろしくお願いします。

#include <iostream>

using namespace std;

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

        operator T * () {
                cout <<"Inside T* () "<<endl;
                return pointee__;
        };
    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 JFunc (JTest * tmp)
{
  cout <<" JFunc"<<endl;
  tmp->display ();
  cout <<"Invoking JTest -> display "<<endl;
}


int main ( int argc, char ** argv)
{
 sPtr <JTest> t(new JTest);
 t->display();
 delete t; // Invokes operator T* () , and it is dangerous!!!..
t->display  ();

}

出力:

Display API x is 100
Inside T* () 
Display API x is 100
4

1 に答える 1

3

t を削除すると、t が指すメモリは未使用としてマークされますが、t に格納されているアドレスはそのまま残ります。t に保存されているオブジェクトを使用しようとすると、C++ は削除されたかどうかをチェックしません。そのため、クラッシュすることがよくありますが、削除されたオブジェクトが使用するメモリがシステムによってまだ上書きされていない場合は、動作することがあります。 .

要するに、これはうまくいく場合もあれば、クラッシュする場合もあり、常に悪い考えです。

自分自身から身を守りたい場合は、削除した後に t を NULL に設定します。

于 2013-02-21T14:22:49.227 に答える