C++ delete[] void* 好奇心

标签 c++ arrays dynamic-allocation

我有一个相当简单但庞大的系统设置。它将数据存储在 void* 数组中,因为它存储的数据可能在 floatdouble 之间变化,具体取决于需要多少精度。

只是执行 delete [] data 引发 warning: deleting 'void*' is undefined [enabled by default] using MinGW。我还有另一个变量告诉我 datafloat* 还是 double*,但我使用哪个有关系吗?

换句话说,我可以使用休闲代码而不用担心内存泄漏或编译器未捕获的其他错误/损坏吗?

double* d_data = new double[length];
data = (void*)d_data;
delete [] (float*)data;

最佳答案

这当然很重要;您用于 delete[] 的指针必须与您分配的指针具有相同的类型。因此转换为 double* 是有效的(但容易出错);转换为 float* 会产生未定义的行为。

[类类型的单个对象(不是数组)有一个异常(exception) - 它可以是指向基类的指针,如果该基类具有虚拟析构函数。但这不适用于 double 等基本类型或数组。]

至于内存泄漏:手动内存管理总是会带来内存泄漏的危险,除非您非常小心,不要做任何可能引发异常的事情。我强烈推荐使用 RAII管理所有动态资源。

关于C++ delete[] void* 好奇心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15260405/

相关文章:

c++ - 在 if() 中比较 LPCWSTR

c++ - 对双向链表进行操作时要注意什么?

C数组地址混淆

c - 矩阵乘法动态分配矩阵错误: segmentation fault (core dump)

c - 如何确保 malloc 和 free 中没有遗漏某些内容?

c++ - malloc 触发断点

c++ - Mingw-x64 中的类型错误

php - 文件数组返回多个数组

arrays - (算法)在不排序的情况下,在 O(n) 时间内查找两个未排序的数组是否有共同元素?

c - 分配指向结构的指针,但不是实际的结构