可以删除以下程序中的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对象类型的指针,删除此指针是否安全?
答案 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
时会出现真正的问题,因为编译器没有删除您要删除的对象,它不知道可以释放多少内存。