在使用原始类型分配空指针后删除它

时间:2013-03-26 04:45:09

标签: c++ void-pointers

可以删除以下程序中的void指针。

class Sample
{
    public:
        int intVal;
        float floatVal;
};

main() {
    Sample *samObj = new Sample();
    void *vPtr = samObj;
    delete vPtr;
}

这只是我编写的示例程序。实际上,在我的项目中,除了做类似的事情之外别无他法。这个类似的代码在.h接口文件中,当我包含这个文件并编译其他组件时,编译器会发出警告消息“warning:delete'void *'is undefined”,但我怀疑是因为我已经分配了空白使用Sample对象类型的指针,删除此指针是否安全?

3 个答案:

答案 0 :(得分:1)

对void指针调用delete是未定义的行为 [Ref] 。你根本不应该这样做。您没有在void指针上调用delete,而是在Sample类型的指针上调用,这很好。

[参考] C ++标准:第5.3.5 / 3节:

  

在第一种选择中(删除   对象),如果是静态类型的   操作数与其动态不同   类型,静态类型应为基础   操作数的动态类型的类   而静态类型应该有一个   虚拟析构函数或行为是   未定义。在第二种选择   (删除数组)如果动态类型   要删除的对象不同于   它的静态类型,行为是   未定义。

脚注:

  

这意味着一个对象不可能   使用void *类型的指针删除   因为没有类型的对象   空隙

答案 1 :(得分:0)

不,以这种方式删除void指针是不安全的。编译器如何“知道”vPtr指向的是什么?编译器不能;运行时间可以,但事实并非如此。

为什么编译器需要“知道”vPtr指向的内容?调用析构函数并知道要释放多少内存。如果编译器为每个分配保留标准头,那么释放多少内存可能不是一个大问题。但我想这是编译器留下的一个细节,所以即使在这个部门,结果也是“未定义的”。

答案 2 :(得分:0)

代码显示正常。 只要你记得将void *vPtr指向null或存在的任何东西。

当您删除void *vPtr时会出现真正的问题,因为编译器没有删除您要删除的对象,它不知道可以释放多少内存。