2010-06-11 86 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); 

在通过简单的包装原始(重命名)功能和转换类型首先实现模板。这可能会让你看到潜在的问题 - 已经通过编译代码。