2016-12-13 19 views
0

Class.h:正在分配項目的指針在構造函數中創建類屬性附加傷害

class Main_manager 
{ 
    public: 
     Main_manager(); 
     ~Main_manager(); 
     Field_manager* field_manag; 
    } 
} 

類構造器:

Main_manager::Main_manager() { 
    Field_manager* field_manager = new Field_manager; 
    this->field_manager = field_manager; 
} 

我認爲這 - > field_manager = field_manager將保持指針剛創建的field_manager對象作爲Main_manager類的一個屬性,所以我可以使用它的方法。

,如果我嘗試調用

Main_manager::function() { 
    this->field.manager->function_call(); 
    //trying to call field.manager's method as i should have its pointer 
} 

它不工作。由於無法讀取內存,應用程序中斷。

this>field.manager = field_manager可能不起作用。構造函數結束後,Main_manager無法讀取field_manager的內存。 我認爲如果我把field_manager的指針作爲類屬性,一切都會好的。

+0

Field_manager * field_manager = new Field_manager;'result in一個異常或產生'nullptr'? –

回答

1

我認爲這個 - > field_manager = field_manager將保持指針

你不必做這些:

Field_manager* field_manager = new Field_manager; 
this->field_manager = field_manager; 

而是在構造函數中,簡單地分配你的指針直接成員:

field_manager = new Field_manager; 
+1

爲什麼不簡單'Field_manager field_manager?'那種情況下'new'的優點是什麼? –

+0

非常感謝。 所以在這個問題中,我在那裏描繪過,所有這些物品在建造師結束後都被銷燬了,不是嗎? – sadboy

+0

不,只有碰巧與類成員具有相同名稱的構造函數中的指針才被銷燬。儘管無法訪問,但您已分配的內存仍保持分配狀態,並且Field_manager對象仍處於活動狀態。你有內存泄漏。類成員的指針永遠不會被初始化(甚至不是nullptr)並且包含垃圾。解除引用會導致未定義的行爲。請查閱條款RAII,成員初始化列表,智能指針和三/五規則以更好地瞭解如何避免這些問題。 – mars

相關問題