关于基础数值类型强制转换指针的delete[]操作简化疑问
关于Draco数据释放函数简化的疑问与解答
问题背景
我在某开源项目中看到如下代码:
void EXPORT_API ReleaseDracoData(DracoData **data_ptr) { if (!data_ptr) { return; } const DracoData *const data = *data_ptr; switch (data->data_type) { case draco::DataType::DT_INT8: delete[] static_cast<int8_t *>(data->data); break; case draco::DataType::DT_UINT8: delete[] static_cast<uint8_t *>(data->data); break; case draco::DataType::DT_INT16: delete[] static_cast<int16_t *>(data->data); break; case draco::DataType::DT_UINT16: delete[] static_cast<uint16_t *>(data->data); break; case draco::DataType::DT_INT32: delete[] static_cast<int32_t *>(data->data); break; case draco::DataType::DT_UINT32: delete[] static_cast<uint32_t *>(data->data); break; case draco::DataType::DT_FLOAT32: delete[] static_cast<float *>(data->data); break; default: break; } delete data; *data_ptr = nullptr; }
由于这些均为无需调用析构函数的基础数值类型,我想咨询是否可以省略switch分支,直接使用如下简化代码:
void EXPORT_API ReleaseDracoData(DracoData **data_ptr) { if (!data_ptr) { return; } const DracoData *const data = *data_ptr; delete[] static_cast<int8_t *>(data->data); delete data; *data_ptr = nullptr; }
解答
完全可以使用简化后的代码,原因如下:
- 对于无自定义析构函数的基础数值类型,
delete[]的执行逻辑不依赖于指针的静态类型。C++运行时库会维护内存块的分配信息(比如字节数),释放时只需要内存的起始地址正确即可。 - 不管原数组是
int8_t、float还是其他基础类型,data->data指向的都是同一块连续内存的起始位置,用任意一种基础类型指针做static_cast后调用delete[],效果完全等价。 - 原代码中的switch分支只是做了不同类型的转换,但对于无析构函数的类型来说,这些转换后的释放操作没有任何区别,因此可以统一简化。
需要注意的前提:必须保证data->data确实是通过new[]分配的基础类型数组,且数组元素没有自定义析构函数。如果后续代码扩展了支持带析构函数的类型,这种简化就不再适用。
内容的提问来源于stack exchange,提问作者tuket
相关产品推荐
相关产品推荐

