2012-12-22 42 views
0

我在C++後很長一段時間,並有一些令我不安的事情困擾。我在這裏發現了類似的問題,但都沒有解決我的問題。那麼,交易是什麼?訪問衝突讀取位置0xcdcdcdcd - VS 2010 win7

SomeClass*** world; 

呈現指針的矩陣SomeClass的對象。

後者,在構造函數中,當我嘗試對其進行初始化,一個像這樣做

for(int i = 0; i<20;i++) 
    for(int j = 0;j<20;j++) 
     world[i][j] = new SomeClass(); 

而且它與消息打破:訪問衝突讀取位置0xcdcdcdcd。 我讀了這封郵件的意思,但仍然不知道如何使它工作。

在此先感謝!

+2

'world'需要先被分配。你需要解引用一個指向隨機的指針。 –

+0

你需要再次從頭學習C++。您的代碼顯示了對語言操作的一些基本誤解。沒有人應該嘗試寫這樣的代碼。 – Puppy

+2

如果您的經驗不足,請不要試圖成爲[三星程序員](http://c2.com/cgi/wiki?ThreeStarProgrammer)。 – 2012-12-22 11:29:34

回答

4

我認爲當你聲明一個變量時,瞭解你的得到了是非常重要的。就像在內存中創建的內容一樣。

那麼讓我們來看看SomeClass*** world;。這是什麼得到你?它是否爲您提供了一個指向SomeClass的指針矩陣?不,它沒有。事實上,你可能會驚訝地發現,這會讓你只有一件事,一件事 - 只有一個指針。是的,沒錯,只有一個指針。你已經定義了這個world這個變量,它是一個指針,這就是你從中得到的所有東西。那個單指針。

該指針應該被用來指向其他指針,指向指向SomeClass的指針。但是,它指出的那些東西還不存在。所以當你迭代ij到20,並且做world[i][j]時,你試圖訪問一個根本不存在的指針矩陣。

我們讓你寫的作品,同時仍然使用SomeClass***,你就需要分配指針的矩陣:所以我們首先撥出20 SomeClass**數組

world = new SomeClass**[20]; 
for (int i = 0; i < 20; i++) { 
    world[i] = new SomeClass*[20]; 
} 

,那麼我們每做這些指針指向分配的數組20 SomeClass*。這給你你想要的...

堅持 - 這是醜陋的。這不是應該如何編寫C++的。非常動態的分配毫無理由。這也意味着你必須記住delete所有的事情 - 而且這也很醜陋。如果不依賴動態分配,這可以變得更容易。你可以只創建一個多維數組,而不是採用指針,已經你的生活會容易得多:

SomeClass* world[20][20]; 

所以現在world是一個20乘20數組的指針來SomeClass。你實際上得到那在內存中。你不會像以前那樣得到一個指針。你會得到一個完整的多維指針數組!幸運的你。

現在,通過簡單地不使用指針就可以使它更好。目前,您需要動態分配SomeClass對象並將指針指向陣列中的指針。但爲什麼不有一個SomeClass而不是數組?

SomeClass world[20][20]; 

現在你有一個多維數組SomeClass對象!生活並沒有比這更好。您不必手動分配或刪除任何內容。您在內存中獲得了一個完整的多維數組,其中每個元素已經是一個SomeClass對象,可以爲您的服務做好準備。

我們甚至可以通過使用標準庫中的容器來進一步提高安全性。如果你使用C++ 03,你可以使用std::vector<std::vector<SomeObject> >,但這可能有點矯枉過正。但是,C++ 11引入了一種整潔地替換使用傳統陣列的類型,並使其更安全:std::array。你可以這樣使用它:

std::array<std::array<SomeObject, 20>, 20> world; 
+0

感謝這真的很深的解釋:) 我將使用SomeClass *世界[20] [20](指針矩陣),因爲後者我需要用兩個不同的子類的指針填充矩陣 – KwahuNashoba

3

您得到的實際錯誤是使用尚未初始化的指針。 0xcdcdcdcd是Visual Studio中內存的「填充模式」。它被選中以便在使用它時「注意」 - 它會導致內存訪問衝突。

如何解決它:谷歌「如何分配兩個二維數組在c + +」。

3

僅有20×20分配的陣列作爲一個部件(或在堆棧上),然後填充:

SomeClass *world[20][20]; 
for ... 

如果尺寸不是恆定的,則需要按行分配行。