c++ - 使用 void 指针删除在堆中分配的变量是一件坏事吗?
问题描述
这段代码有问题吗?我的意思是删除语句。
int *x = new int;
*x = 13;
void *ptr = x;
delete (int *)ptr;
解决方案
即使您使用的是显式类型转换,也适用于规则static_cast
。相关规则在页面@cppreference.com的static_cast
第 10 点:
将任何指针转换为指向 void 的指针并返回到指向原始(或更多 cv 限定)类型的指针都会保留其原始值。
在您的情况下,您从指向- 的指针开始int
。void
您在初始化时将其转换为指向-的指针ptr
。int
您在delete
语句中转换回指向指针。这保留了原始值,这意味着两者(int *)ptr
和x
评估到相同的地址(并且具有相同的类型),因此
delete (int *)ptr;
和
delete x;
是等价的。(我还要补充
delete static_cast<int*>(ptr);
static_cast
自从养成使用et al的习惯后,就加入了列表。而不是 C 风格的演员表可以在将来为您省去头疼的问题。)
推荐阅读
- sql - 如何将多边形延伸到一定距离?
- jsplumb - 如何获取 jsplumb 中选定块的所有连接并将所有连接设为红色
- python - Python 3 中 str.translate 的自定义表
- xml - 将片段中的布局项限制在主要活动底部栏导航的顶部?
- stackdriver - 如何将自定义指标从 collectd(stackdriver 代理)发送到 stackdriver
- c# - 使用正则表达式从复杂字符串中获取数据
- mysql - mysql中带有用户定义变量的IF条件
- database - 最大连接池是否也限制了与数据库的最大连接?
- python - 在 OpenCV 中使用 cv2.VideoCapture.read() 方法捕获什么数据类型?
- c# - 列表输入