代码有什么问题。它应该是什么。因为它正在引发错误。运算符“删除”,应用于 void* 参数。
int i;
void *ptr = &i;
delete ptr;
代码有什么问题。它应该是什么。因为它正在引发错误。运算符“删除”,应用于 void* 参数。
int i;
void *ptr = &i;
delete ptr;
代码有什么问题。
一切除了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;
当然,如果您编写的代码应该能够抵御内存泄漏和运行时错误,那么您应该使用容器和智能指针等RAII类型来管理所有动态内存。所以,如果你需要一个动态对象,你应该这样做:
std::unique_ptr<int> ptr(new int);
如果您想在当前范围的末尾删除它或将其移动到另一个范围;或者
auto ptr = std::make_shared<int>();
如果您想在多个范围之间共享所有权。在任何一种情况下,一旦你完成它,指针就会自动删除它。
你应该只删除你用 new 分配的东西。
确实非常顽皮的代码;
void* ptr = &i
。您的编译器非常宽松地发出您的代码。delete
你已经new
编辑过的东西void*
因为所有sizeof
数据都丢失了。您的代码将不起作用,因为您正在尝试删除未动态分配的内容。
无论如何删除 void 指针是未定义的,有关更多信息,请参阅此 Q&A