2013-05-31 20 views
0

我已經宣佈下列類型的矢量:複製向量和代碼進入_CrtIsValidHeapPointer()

vector<CDFE> vDFE; 

其中CDFE是一個類,它包含一個可變double usage

我訪問它通過指針如下,例如:

pDoc->vDFE.at(i).usage; 

我創建如下的臨時矢量,因爲我不希望修改vDFE

vector<CDFE> tempDFE(pDoc->vDFE); 

但是當我運行的前衛,它使用了一些功能_CrtIsValidHeapPointer()

我在做什麼錯?

您的幫助非常有幫助。

以下是一些代碼:

class CDFE : public CRect 
{ 
    public: 
     CDFE(); 
     virtual ~CDFE(); 
     double usage; 
} 


void CRXView::OnDraw(CDC* pDC) 
{ 
    CRXDoc* pDoc = GetDocument(); 
    vector<CDFE> tempDFE(pDoc->vDFE); 
} 

CRXDoc* CRXView::GetDocument() const // non-debug version is inline 
{ 
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRXDoc))); 
    return (CRXDoc*)m_pDocument; 
} 
+2

許多可能的原因,腐化堆從來沒有這麼困難。首先看三條規則,並確保你將它應用到你的CDFE類中,並且它的拷貝構造函數和賦值操作符都是可靠的。 –

+0

它會在那裏產生錯誤嗎?我相信函數只是檢查指針是否有效。 – Angew

+0

哪一行觸發行爲?你可以通過調試器來看看究竟哪一行導致你的程序出錯了嗎? – Jimbo

回答

0

我不確定什麼pDoc->DFE在做什麼。你不是說pDoc->vDFE

調試消息表示內存問題。

您是否確定了矢量大小?例如,嘗試使用

vector<CDFE> vDFE(10); 

這將創建一個帶有10個默認構造CFDE的向量。

請確保我不會大於9.

+0

我已經將vDFE的大小設置爲100,並且最大不超過60。 –

+0

我需要更多信息。關於「我不確定pDoc-> DFE在做什麼,你是不是指pDoc-> vDFE?」。你能否包括CDFE聲明? – Bathsheba

+0

我現在已經包含聲明。 –

1

錯誤是由於內存損壞。 在沒有使用任何類型的拷貝構造函數的情況下,使用具有類對象的向量通常是一個壞主意。在這種情況下,相同的存儲器地址可能被釋放幾次;導致可能的內存損壞。

現在可能還有其他可能的問題,例如,如果您將其構建爲DLL,那麼根據您如何將代碼鏈接到其他模塊/應用程序,也可能會產生一些堆損壞。

希望這會有所幫助, 關於。

+0

感謝您的回覆。它不是一個DLL。我如何解決複製構造函數的問題?再次感謝 –

+0

檢查鏈接http://www.cplusplus.com/articles/y8hv0pDG/部分:何時需要編寫複製構造函數? 你是否正在執行任何可能出現該問題的操作? 順便說一句,這是一個獨立的應用程序?導致靜態鏈接庫也會發生堆損壞(不僅僅是dll)。 – fadedreamz