首页 > 解决方案 > 使用 void 指针删除在堆中分配的变量是一件坏事吗?

问题描述

这段代码有问题吗?我的意思是删除语句。

int *x = new int;

*x = 13;

void *ptr = x;

delete (int *)ptr;

标签: c++heap-memory

解决方案


即使您使用的是显式类型转换,也适用于规则static_cast。相关规则在页面@cppreference.comstatic_cast第 10 点:

将任何指针转换为指向 void 的指针并返回到指向原始(或更多 cv 限定)类型的指针都会保留其原始值。

在您的情况下,您从指向- 的指针开始intvoid您在初始化时将其转换为指向-的指针ptrint您在delete语句中转换回指向指针。这保留了原始值,这意味着两者(int *)ptrx评估到相同的地址(并且具有相同的类型),因此

delete (int *)ptr;

delete x;

是等价的。(我还要补充

delete static_cast<int*>(ptr);

static_cast自从养成使用et al的习惯后,就加入了列表。而不是 C 风格的演员表可以在将来为您省去头疼的问题。)


推荐阅读