使用delete运算符删除void指针

时间:2013-05-29 10:10:53

标签: c++ void-pointers

代码有什么问题。应该是什么。因为它抛出一个错误。运算符'delete',应用于void *参数。

int i;
void *ptr = &i;

delete ptr;

4 个答案:

答案 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)

确实非常顽皮的代码;

  1. 你没有拿到我的地址;使用void* ptr = &i 代替。你编译的代码非常宽松。
  2. 您正在从堆栈中删除。不好。你只能deletenew ed
  3. 的内容
  4. 编译器不知道要删除多少内存 传递void*,因为所有sizeof数据都已丢失。

答案 3 :(得分:0)

您的代码无效,因为您试图删除未动态分配的内容 无论如何删除void指针是未定义的,有关详细信息,请参阅this Q&A