2013-01-24 91 views
-2

使用new來分配內存並初始化一個類的變量。新運算符導致內存損壞

這裏使用的代碼:

新運營商:

ptrIssuResrc = new IssuResource(); 
----------------------------------- 

類定義:

class IssuResource 
{ 
public: 
    // constructor: create a IssueResource object 
    IssuResource(void) 
    { 
     lastUpdatedResource = 0; 
    } 
    UINT16 lastUpdatedResource; 
    UINT32 conn_list[MAX_CONNECTION]; 
    bool addConnResourceToList(UINT32); 

使用ptrIssuRescr

class IssuResource *issuResrcPtr = NULL; 
issuResrcPtr = card->ptrIssuResrc; 

class IssuResource *ptrIssuResrc = card->ptrIssuResrc; 
ptrIssuResrc->addConnResourceToList(connection->getLcn()); 

由於此代碼,我正面臨一些內存損壞,已經縮小。請幫我解決這裏最新的錯誤?我怎樣才能確保沒有記憶coruuption?我已經將新操作符移動到代碼中的另一個位置,並且它工作正常。但我仍然需要確保不會導致新問題。

TIA

+0

您在此代碼中的任何地方都沒有使用'new'。 – Gorpik

+0

訪問'conn_list'時可能超出邊界,發佈更多相對於1conn_list1訪問的代碼? – billz

+1

conn_list保持未定義狀態,未指定MAX_CONNECTION。 – Arjan

回答

0

那麼,有沒有很多在您的文章上下文的,但你可以嘗試運行在Valgrind的這段代碼,看看是否有任何記憶韭菜,訪問未初始化的數據,等等。

也許一些代碼ilustrates的問題將有助於...

2

我們不能真正幫助你,因爲我們不熟悉你的代碼。你的類定義並沒有告訴我們所有的東西 - 我們應該知道你的對象在執行代碼時究竟發生了什麼。如果你不能使用Valgrind,我會推薦你​​使用AppVerifier + DebugDiag,它們是免費的並且可以在Windows操作系統上運行。

這些應用程序幫助我了很多內存損壞。我花了很長時間才發現我的代碼有什麼問題,並且感謝他們只花了幾分鐘的時間來完成這個任務。

下面是如何使用他們很好的教程鏈接:http://blogs.msdn.com/b/lagdas/archive/2008/06/24/debugging-heap-corruption-with-application-verifier-and-debugdiag.aspx

它基本上會告訴你在哪個地方出現堆損壞,所以這將是您更容易找到問題。

希望這會幫助你。