0

可以在下面的程序中删除 void 指针吗?

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

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

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

4

3 回答 3

1

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

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

在第一种选择(删除对象)中,如果操作数的静态类型与其动态类型不同,则静态类型应为操作数动态类型的基类,并且静态类型应具有虚拟析构函数或行为未定义. 在第二种选择(删除数组)中,如果要删除的对象的动态类型与其静态类型不同,则行为未定义。

脚注:

这意味着不能使用 void* 类型的指针删除对象,因为没有 void 类型的对象

于 2013-03-26T04:48:58.100 回答
0

代码看起来没问题。只要你记得指向void *vPtrnull 或任何存在的东西。

当您 delete 时,真正的问题来了void *vPtr,因为编译器不知道您要删除什么对象,它不知道可以释放多少内存。

于 2013-03-26T05:21:53.060 回答
0

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

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

于 2013-03-26T04:50:21.893 回答