2014-05-24 70 views
0

我已經實現了一個智能指針類,當我試圖編譯時,它停在一個特定的行上,我得到這個消息:未處理的異常在test.exe中0x00418c38:0xC0000005:訪問衝突讀取位置0xfffffffc。在test.exe 0x00418c38未處理的異常:0xC0000005:訪問衝突讀取位置0xfffffffc

我的代碼是:

template <class T> 
class SmartPointer 
{ 
    private: 
     T* ptr; 
     int* mone; 
    public: 
     SmartPointer() : ptr(0), mone(0) //default constructor 
     { 
      int* mone = new int (1); 
     } 

     SmartPointer(T* ptr2) : ptr(ptr2), mone(0) 
     { 
      int* mone = new int (1);   
     } 

     SmartPointer<T>& operator= (const SmartPointer& second) //assignment operator 
     { 
      if (this!= &second) 
      { 
       if (*mone==1) 
       { 
        delete ptr; 
        delete mone; 
       } 

       ptr = second.ptr; 
       mone = second.mone; 
       *mone++; 
      } 
      return *this; 
     } 

     ~SmartPointer() // Destructor 
     { 
      *mone--; 
      if (*mone==0) 
      { 
       delete ptr; 
       delete mone; 
      } 
     } 
}; 

我也有一個*和&重載函數和拷貝構造函數。

它停止在這裏:

if (*mone==0) 

請你幫我嗎? thaks

+0

請編譯所有警告和調試信息([GCC](http://gcc.gnu.org/)表示'g ++ -Wall -g')。然後使用你的調試器(Linux系統上的'gdb')。另外,使用STL智能指針。 –

回答

5
SmartPointer() : ptr(0), mone(0) //default constructor 
{ 
    int* mone = new int (1); // PROBLEM 
} 

您正在構造函數中聲明一個名爲mone的本地變量。這會隱藏您的成員變量具有相同的名稱。因此,您的成員變量初始化爲0(來自初始化程序列表),但從未設置爲指向任何內容。

使用這個代替:

mone = new int (1); 

或者直接做到這一點:

SmartPointer() : ptr(0), mone(new int(1)) {} 

的聲明中不會有你他們他們做什麼*mone++;*mone--;。後綴增量/減量應用於指針,而不是它指向的東西。

*(mone++); 

您需要括號:即被解析

(*mone)++; 

確保你有你的編譯器警告開啓到最大,這兩個鐺和g ++表示存在可疑之處與線。

+1

+1一旦這個問題得到解決,OP可能會想要對'* mone ++'和'* mone - '做些什麼,我保證不會做他們認爲的事情。這次崩潰即將發生。 – WhozCraig

+0

好點,沒有發現那些謝謝。 – Mat

相關問題