删除铸造指针基本类型

问题描述 投票:0回答:1

我在一个开源项目中看到过这段代码:

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;
}

我想知道,既然这些只是基本的数字类型,不需要调用析构函数,我们可以避免进行切换吗?

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;
}
c++ delete-operator
1个回答
0
投票

谢谢大家的评论。

总而言之,不幸的是,答案是否定的。

删除[]的文档

ptr 必须是空指针或者其值之前为的指针 通过 new-expression 的数组形式获得,其分配函数 不是非分配形式(即重载 (10))。所指向的 ptr 的类型必须与数组的元素类型相似 目的。如果 ptr 是其他任何东西,包括它是否是获得的指针 通过 new-expression 的非数组形式,行为是未定义的。

因此,只有当类型相似时,这才有效,但事实并非如此。

© www.soinside.com 2019 - 2024. All rights reserved.