2013-02-28 80 views
0

的問題如下:指針丟失在發佈版本

有一個構造函數,其中一個指針參數

m_pszBuf= new char[260]; 
//Still valid , to prove i'm printing the address 
    std::cout <<"Address "<< (void*)m_pszBuf <<std::endl; 
    device = new Device(m_pszBuf); 


Device::Device(char* _ptr){ 
strcpy(dest,_ptr); 
} 

有趣的是通話,構造函數的調用之前,指針仍然有效並且具有地址和值,但是一旦它進入ctor,它就成爲一個錯誤的指針(0x0000005c)。另外,它在調試模式下工作,但不在釋放模式下工作。

+2

那麼第一行是無效的(假設你不能將'Foo *'轉換爲'Foo')。我們需要看到更多的代碼。 'ptr'從哪裏來? – 2013-02-28 10:47:51

+1

我希望你的意思是'Foo * f = new Foo(ptr)' – UmNyobe 2013-02-28 10:47:53

+0

'ptr'指向什麼? – juanchopanza 2013-02-28 10:47:55

回答

0

偉大的輸入,但我用其他東西解決了它。我有一些頭文件「不同步」,用於庫。我只需要更新它們。奇怪這是如何影響別的東西的。

4

初始化m_pszBuf這樣的:

m_pszBuf = new char[260]; 

然後調用Device構造是這樣的:

device = new Device(m_pszBuf); 

裏面Device構造,有來自m_pszBufstrcpy電話:

Device::Device(char* _ptr) // _ptr == m_pszBuf 
{ 
    strcpy(dest, _ptr); 
} 

但是,如果m_pszBuf不是以NUL結尾的,strcpy不會停止在分配的緩衝區末尾,並且它可以從超出範圍的內存中複製垃圾,並且可以超出dest緩衝區。

因此,通過m_pszBufDevice構造函數之前,請確保它是NULL結尾strcpy目標指針足夠大。

注意:此分析僅基於您展示的代碼段。 (我不知道是否在你的實際代碼中,你忽略了顯示還有其他問題。)

+2

+1這可能是點亮。調試分配器通常對內存進行零初始化(我討厭它,因爲它使得在調試構建中發現這樣的問題更加困難)。很好的接收。 – WhozCraig 2013-02-28 11:18:54

+0

它不是關於目的地,它是在構造函數中變成無效指針的源。它停下來指向任何東西。 – 2013-02-28 11:39:32

+0

@thebaconing:可能是因爲'strcpy'(或別的?)覆蓋它?這很難做「心理調試」_ :)你可能想提供一個可編譯的代碼片段來顯示問題。請考慮@ WhozCraig關於Three_的_Rule的評論(或者Device類沒有複製語義,聲明'private'複製構造函數和'operator =')。但是你有沒有試過按照我的建議和NUL終止'm_pszBuf'? (或者只是使用'memcpy',而不是'strcpy')。 – 2013-02-28 11:43:19