-4

代码有什么问题。它应该是什么。因为它正在引发错误。运算符“删除”,应用于 void* 参数。

int i;
void *ptr = &i;

delete ptr;
4

4 回答 4

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;

当然,如果您编写的代码应该能够抵御内存泄漏和运行时错误,那么您应该使用容器和智能指针等RAII类型来管理所有动态内存。所以,如果你需要一个动态对象,你应该这样做:

std::unique_ptr<int> ptr(new int);

如果您想在当前范围的末尾删除它或将其移动到另一个范围;或者

auto ptr = std::make_shared<int>();

如果您想在多个范围之间共享所有权。在任何一种情况下,一旦你完成它,指针就会自动删除它。

于 2013-05-29T10:20:51.497 回答
2

你应该只删除你用 new 分配的东西。

于 2013-05-29T10:13:12.020 回答
1

确实非常顽皮的代码;

  1. 您没有获取 i 的地址;改为使用void* ptr = &i 。您的编译器非常宽松地发出您的代码。
  2. 您正在从堆栈中删除。不好。你只能编辑delete 你已经new编辑过的东西
  3. 如果您传递所有数据,编译器不知道要删除多少内存,void*因为所有sizeof数据都丢失了。
于 2013-05-29T10:13:09.267 回答
0

您的代码将不起作用,因为您正在尝试删除未动态分配的内容。
无论如何删除 void 指针是未定义的,有关更多信息,请参阅此 Q&A

于 2013-05-29T10:12:56.817 回答