2012-01-27 84 views
0

我有一個相當大的遺留應用程序,它只使用普通的指針。 現在我正在添加一個新模塊,試圖使用「更現代的東西」,例如聰明的指針。當使用指針和shared_pointer時刪除訪問衝突

主模塊發送在通信DLL消息給我的新子模塊(與正常指針)。 在我的新子模塊中,我使用shared_pointer進行消息處理。 當共享指針嘗試刪除指針時,由於VTable指針是0xdddddddd,所以在該消息的解析器中出現訪問衝突。我已經找到this SO question,其中說這是因爲指針已經被釋放。

似乎主模塊已經刪除正常指針,前共享指針刪除它。

我不想在舊的主模塊中使用共享指針(在這一點上會非常重構),但是有沒有解決方法,我如何在我的應用程序中使用普通指針和共享指針? 在析構函數中通常的NULL檢查並沒有幫助。

回答

1

你需要確保主模塊將指針的所有權。
即:它發送到你的模塊後,它不應該維護任何指向該地址的指針。否則,它可能會釋放指針,讓模塊留下一個懸掛指針。

因此,如果主模塊,然後使用shard_ptr維持指針引用只爲你的模塊沒有意義。在這種情況下,您也需要在主模塊中使用shared_ptr

此外,您還需要確保您使用適當的內存釋放程序在shared_ptr::deleter()指針。
可能是在指針的分配和釋放例程中存在不匹配的情況。

+0

這幫助我瞭解了改進我們的舊版應用程序時該怎麼做。但是,我縮小了問題範圍,似乎在我的子模塊 – Simon 2012-01-27 11:41:26

+0

@Simon中存在問題:沒問題。祝你好運:) – 2012-01-27 15:40:48