代码有什么问题。应该是什么。因为它抛出一个错误。运算符'delete',应用于void *参数。
int i;
void *ptr = &i;
delete ptr;
答案 0 :(得分:7)
代码有什么问题。
除int i;
第二行尝试将整数转换为指针。在特殊情况下,您可以使用reinterpret_cast
强制通过编译器;但是如果整数以某种方式包含有效的指针值,程序将只能正常运行。 (更新:现在已对问题进行了修改,以取代i
的地址;因此此行不再错误。)
第三行尝试使用无效指针类型删除无效内存。
应该是什么。
别的。不知道你想做什么,这是不可能的。也许你想要:
int i;
void * ptr = &i; // Points to `i`, losing type information.
运算符
delete
,适用于void*
参数。
这总是错的。您必须delete
new
以前使用int * ptr = new int;
delete ptr;
分配的对象;并且指针必须是正确的类型。
(或基类,如果它是带有虚析构函数的类类型)
所以以下是正确的;但除非你有充分的理由进行动态分配,否则毫无意义:
std::unique_ptr<int> ptr(new int);
当然,如果您编写的代码应该能够抵御内存泄漏和运行时错误,那么您应该使用RAII类型管理所有动态内存,例如容器和智能指针。所以,如果你需要一个动态对象,你应该这样做:
auto ptr = std::make_shared<int>();
如果您想在当前范围的末尾删除它或将其移动到另一个范围;或
{{1}}
如果您想在多个范围之间共享所有权。在任何一种情况下,指针都会在你完成它后自动删除它。
答案 1 :(得分:2)
您应该只删除使用new分配的内容。
答案 2 :(得分:1)
确实非常顽皮的代码;
void* ptr = &i
代替。你编译的代码非常宽松。delete
您new
ed void*
,因为所有sizeof
数据都已丢失。答案 3 :(得分:0)
您的代码无效,因为您试图删除未动态分配的内容 无论如何删除void指针是未定义的,有关详细信息,请参阅this Q&A