我有一个相当简单但庞大的系统设置。它将数据存储在 void*
数组中,因为它存储的数据可能在 float
或 double
之间变化,具体取决于需要多少精度。
只是执行 delete [] data
引发 warning: deleting 'void*' is undefined [enabled by default]
using MinGW。我还有另一个变量告诉我 data
是 float*
还是 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/