2014-01-23 110 views
0

我在調用程序的析構函數時遇到了一些問題。我有這些類:C++:刪除指針陣列時出錯

  • myModule是指針數組的基類。
  • myModule_in是一個代表具有輸入端口的模塊的子類(有一個myModule_outmyModule_inout,因爲它不是必需的,所以不會顯示在這裏)。
  • moduleC是輸入端口模塊之一(moduleAmoduleBmyModule_outmyModule_inout)。

Mymodule中:

class myModule 
    { 
    public: 

     myPort* secondary_ins[NUM]; 

     myModule() {} 

     virtual ~myModule() 
     { 
     for(int i=0; i<NUM; i++) 
     { 
      if(secondary_ins[i]) 
      delete secondary_ins[i]; 
     } 
     } 

     virtual void connect(myModule &m) = 0; 
    }; 

myModule_in:

class myModule_in : public myModule 
    { 
    public: 
     virtual ~myModule_in() {} 

     virtual void connect(myModule &m) 
     { 
     secondary_ins[ins] = new myPort(); 
     ... 
     } 

    }; 

moduleC:

class moduleC : public myModule_in 
    { 
    public: 

     moduleC(); 
     ~moduleC() {} 

     void connect_modules() {...} 

    }; 

主:

int main(...) 
    { 
     moduleA mA; 
     moduleB mB; 
     moduleC mC; 
     ... 
     mA.connect(mB); 
     mB.connect(mC); 
     ... 
     return 0; 
    } 

該代碼編譯正確並且工作正常,直到執行結束,我得到的段錯誤爲:delete secondary_ins[i];return 0;被調用。奇怪的是,其他模塊的destructor也被稱爲,並沒有任何問題。處理從基類繼承的指針數組可能有問題嗎?有任何想法嗎?

謝謝:)

+0

http://bit.ly/1dS4wcV – 735Tesla

+0

哦!謝謝@ 735Tesla!我永遠不會想到這一點! – makeMonday

回答

4

當你聲明:

myPort* secondary_ins[NUM]; 

無處可保證陣列將被0初始化。因此,測試:

if(secondary_ins[i]) 

在析構函數可能傳遞即使元素是不是一個有效的指針初始化。爲了方便解決,只需使用0(在C++ 11之前)或nullptr(從C++ 11開始)初始化數組。

對於真正的解決,只是使用的std::vectorstd::arraystd::unique_ptr的組合。

+0

我只是寫道,我已經嘗試過,並沒有工作。但我只是意識到我在錯誤的地方初始化陣列。在這裏,還有一個問題。我在'myModule'中做了這件事,它不起作用,所以我在每個'moduleX'中做了它(現在它工作)。可以嗎?有沒有一種通用的方法來做到這一點?再次感謝! – makeMonday

+1

@makeMonday,是的,你使用'std :: unique_ptr'來自動初始化爲'nullptr'。 – Shoe