You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于基础数值类型强制转换指针的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:25:15