2010-06-11 83 views
6

我繼承了一個最初用C編寫的大應用程序(但同時還增加了很多C++)。由於歷史原因,該應用程序包含很多無效指針。在你開始窒息之前,讓我解釋爲什麼這樣做。如何擺脫空指針

該應用程序包含許多不同的數據結構,但它們存儲在'通用'容器中。現在我會爲它使用模板化的STL容器,或者我會爲所有數據結構提供一個通用的基類,以便容器可以存儲指向基類的指針,但是在[良好]舊C日,唯一的解決方案是將結構指針轉換爲void指針。

此外,還有大量的代碼,在這些空隙指針工作,並且使用非常奇怪Ç結構中C.

我現在再加工中的應用,並試圖效仿多態性擺脫的空洞的指針。爲所有數據結構添加一個通用基類並不困難(工作幾天),但問題是代碼充滿了如下所示的構造。

這是數據是如何存儲的一個例子:

void storeData (int datatype, void *data); // function prototype 
... 
Customer *myCustomer = ...; 
storeData (TYPE_CUSTOMER, myCustomer); 

這是多麼數據的例子又是牽強:

Customer *myCustomer = (Customer *) fetchData (TYPE_CUSTOMER, key); 

其實我是想取代所有的空隙指針與一些智能指針(引用計數),但我找不到自動化的技巧(或至少)幫助我擺脫所有指向void指針的指針。

有關如何查找,替換或以任何可能的方式與這些轉換進行交互的任何提示?

+1

我真的相信這樣做不會自動做到這一點。一個接一個...... – INS 2010-06-11 21:01:34

+0

存儲和獲取函數對'datatype'做什麼?他們是在對結構進行盲目複製還是僅僅存儲該空指針? – 2010-06-11 21:03:50

+0

數據類型用於將所有相同數據類型的數據一起存儲,並對數據類型執行一些「通用」邏輯。如上所述,它模擬普通C中的多態性。 – Patrick 2010-06-11 21:13:23

回答

0

顯然,沒有自動化的方法/技巧來轉換或查找void指針的所有用法。我將不得不使用體力勞動來查找所有無效指針,與PC-Lint結合使用,只要出現不正確的轉換,就會發生錯誤。

案件關閉。

0

您可能不需要擺脫使用共享指針的強制轉換。

storeData(TYPE_CUSTOMER, myCustomer1->get()); 

shared_ptr<Customer> myCustomer2(reinterpret_cast<Customer*>fetchData(TYPE_CUSTOMER, "???"); 

當然,這裏假設你不希望跨存儲/獲取調用共享相同的指針。換句話說,myCustomer1和myCustomer2不共享相同的指針。

7

其實我是想全部更換 空隙指針與一些智能指針 (引用計數),但我找不到 一招,自動化(或至少)幫助 我弄從void指針中移除所有的表達式和 。

這種自動重構承擔了很多風險。

否則,有時候我喜歡玩模擬功能的void *函數。那:

void storeData (int datatype, void *data); 

變爲:

template <class T> 
void storeData (int datatype, T *data); 

在通過簡單的包裝原始(重命名)功能和轉換類型首先實現模板。這可能會讓你看到潛在的問題 - 已經通過編譯代碼。