2012-02-06 51 views
2

说我有类似的东西在公共标题:是否可以安全地删除从C++中的void被抛出的指针?

class MyClass 
{ 
public: 
    MyClass(); 

protected: 
    virtual ~MyClass(); 

private: 
    void *pSomeInternalClass; 
} 

下面是我的实现:

MyClass::MyClass() 
{ 
    pSomeInteralClass = (void *) new SomeInternalClass(); 
} 

MyClass::~MyClass() 
{ 
    SomeInternalClass *pTemp = (SomeInternalClass *) pSomeInternalClass; 
    delete pTemp; 
    pSomeInternalClass = NULL; 
} 

void指针背后的想法是,我dont't必须包括公共标题中内部类的定义。

我的问题是:我是否以安全的方式处理void指针?删除有问题吗?

谢谢!

回答

7

只要您将其恢复为原始类型,它就很安全。

但你不需要那样做。只需向前 - 在公开标题中声明您的内部类型,并且您不需要执行此恶意演员。

class YourClass { 
    ... 
    private: 
    class Internal; 
    Internal *pInternal; 
}; 
+0

Afaik,不需要回到原始类型。只有地址用于查找内存中的相应块。 – msteiger 2012-02-06 08:11:36

+1

更好的想法是在MyClass的private:部分中声明该类,而不是将其与MyClass相同的级别暴露给头的客户端。 – 2012-02-06 08:13:07

+2

不,你需要将其转换为原始类型(虚拟析构函数放松一点)。 'A * a = new A(); B * b =(B *)(void *)a;删除b;'将调用'B ::〜B',而不是'A ::〜A',@ user198397 – Mat 2012-02-06 08:14:03

3

您不需要在公共标题中包含该类的定义。即

class SomeInternalClass ; 
class MyClass 
{ 
public: 
    MyClass(); 

protected: 
    virtual ~MyClass(); 

private: 
    SomeInternalClass *pSomeInternalClass; 
} 
+0

更好的想法是在'MyClass'的'private:'部分声明类,而不是将其与MyClass相同的级别暴露给头的客户端。 – 2012-02-06 08:12:41