可能的重复:
删除空指针安全吗?
说我有一个new
分配给一个名为MyClass
分配很简单:
MyClass *myClassPtr = new MyClass();
我存储了对列表的引用void*
我简单地说
myListOfPointers.add(static_cast<void*>(myClassPtr)); // this has to be void*
后来我释放内存,而不是这样做:
delete myClassPtr
I use:
delete MyListOfPointer.get(0)
(假设 myClassPtr 引用的索引为零。)另外,请注意,它必须是void*
因为这个列表可以存储不同类型的指针,所以我不知道我要删除的指针的类型:
所以我不能做这样的事情:
delete static_cast<MyClass*>(MyListOfPointer.get(0))
这种方式会释放正确的内存大小吗? (sizeof(MyClass)
)?
Note:
我并不是在寻找任何指向智能指针的答案。
通过删除void*
导致未定义的行为,所以你不能得到任何保证。
5.3.5 删除[expr.delete]
1 The delete-expression operator destroys a most derived object (1.8) or array created by a new-expression.
[...]
The operand shall have a pointer to object type, or a class type having a single non-explicit conversion function (12.3.2) to a pointer to object type. The result has type void.78
78) 这意味着不能使用 void* 类型的指针删除对象,因为 void 不是对象类型。
强调我的。
因此,即使您说不说,答案也是创建某种形式的智能指针。它需要使用类型擦除在外部隐藏类型(允许异构列表),但在内部跟踪给定的类型以及如何删除它。很像的东西boost::any
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)