删除void指针是否保证删除正确的大小?

abu*_*amq 10 c++ pointers memory-management void

可能重复:
删除空指针是否安全?

假设我有一个new被调用的类的分配MyClass,分配就像这样简单:

MyClass *myClassPtr = new MyClass();
Run Code Online (Sandbox Code Playgroud)

我存储参考void*我简单说的位置列表

myListOfPointers.add(static_cast<void*>(myClassPtr)); // this has to be void*
Run Code Online (Sandbox Code Playgroud)

后来我释放内存而不是做:

delete myClassPtr
Run Code Online (Sandbox Code Playgroud)

我用:

delete MyListOfPointer.get(0)
Run Code Online (Sandbox Code Playgroud)

(假设myClassPtr引用是零索引.)另外,请注意它必须是void*因为这个列表可以存储不同类型的指针所以我不知道我删除的指针类型:

所以我不能做任何事情:

delete static_cast<MyClass*>(MyListOfPointer.get(0))
Run Code Online (Sandbox Code Playgroud)

这种方式是否会释放正确的内存大小?(sizeof(MyClass))?

注意:
我不是在寻找指向智能指针的任何答案.

GMa*_*ckG 14

通过void*未定义行为的结果删除,因此您无需担保.

5.3.5删除[expr.delete]

1 delete-expression运算符销毁由new-expression创建的派生程度最高的对象(1.8)或数组.
[...]
操作数应具有指向对象类型的指针,或具有指向对象类型的指针的单个非显式转换函数(12.3.2)的类类型.结果类型为void.78

78)这意味着无法使用void*类型的指针删除对象,因为void不是对象类型.

强调我的.


所以即使你说不说,答案是创建某种形式的智能指针.它需要使用类型擦除来从外部隐藏类型(允许异构列表),但在内部跟踪它的类型以及如何删除它.有点像boost::any.