2014-12-04 42 views
0

我創建了一個類時,說我把它命名爲MyClass,以及另一個從它繼承,說MyClassDaughter然後我試過如下:段違規試圖訪問向量入口

MyClassDaughter *MyClassDaughterPointer; 
vector <MyClass*> MyClassVector; 
MyClassVector.push_back(MyClassDaughterPointer); 
MyClassVector[0]->SetSomethingInMyClassDaughter; 

當我嘗試運行它所說的「分段違例」的可執行文件。 (我認爲必須說我的代碼有一些Root的東西在裏面...可能是這個問題嗎?無論如何,我知道,通常情況下,分段違規錯誤是由於嘗試訪問我們沒有權限的內存導致的訪問,但我認爲我有權限訪問這個內存,我錯了嗎?)

回答

2

您不初始化MyClassDaughterPointer,因此您將一些隨機(通配符)指針推向該向量。

您需要創建MyClassDaughterPointer的新實例。假設你有一個默認的構造函數,它看起來就像這樣:

MyClassDaughter *MyClassDaughterPointer = new MyClassDaughterPointer(); 
+1

指針值是* not *必然是NULL - 它可以是任何東西。 – 2014-12-04 20:59:23

+0

Humm ...這可能是一個愚蠢的問題(我確實感到愚蠢的問題)但我該如何初始化它? MyClassDaughter * MyClassDaughterPointer = new MyClassDaughter(某事)? – FranciscoS 2014-12-04 21:01:38

+0

@AndrewMedico你是對的,編輯答案。 – bialpio 2014-12-04 21:03:26

0

指針

MyClassDaughter *MyClassDaughterPointer; 

從未設置過任何東西,但有一些初始化的內容,如果這是在堆棧或空的那是靜止的。因此,您不能像嘗試那樣訪問它,導致未定義的行爲。

MyClassVector[0]->SetSomethingInMyClassDaughter; // that is same pointer set in vector entry 

不確定只要它通常有這樣的代碼進行優化,並認爲不應該有任何的影響是什麼編譯器 - 在所有隻要是指針不使用沒有工作的CPU在這裏。但調試模式總是試圖將地址加載到某個寄存器。