检索数组的最干净的方法是什么?

What is the cleanest way of retrieving an array?

本文关键字:方法 是什么 数组 检索      更新时间:2023-10-16

我需要一个返回任意长度的数据块(char *)的函数。函数调用者既需要数组,也需要数组的大小。这个数组可以在函数内部动态分配,或者作为参数传递。有多种方法可以达到相同的结果。现在我想知道在c++中什么是"最干净"的方法。我将在下面给出例子。

返回数组,修改长度(作为引用):

char *getData( int &length ) {
  length = // set length
  char *data = new char[ length ];
  // fill data here
  return data;
}

返回长度,修改数组(作为引用):

int getData( char * &data ) {
  int length = // set length
  data = new char[ length ];
  // fill data here
  return length;
}

返回成功代码,修改数组和长度(作为引用)

bool getData( int &length, char * &data ) {
  int length = // set length
  data = new char[ length ];
  // fill data here
  return true; // Successful
}

填充所提供的数组,返回完整长度(可能无法获得所有数据):

int getData( char *data, int maxLength ) {
  int length = // set length
  // fill data here, to max size of min( length, maxLength )
  return length;
}

可能有更多的可能性这样做,但是在c++中,什么被认为是"最干净"的方式呢?

都没有。如果您正在使用c++,而不仅仅是C,那么请继续使用它提供的语义。

您确实想使用std::vector,特别是std::vector<char>

不要自己制作或处理c风格的东西,这是浪费时间。

您有几个选择。正如评论者所提到的,大多数c++方法是使用标准容器。这就是他们存在的意义。这样还可以避免由于手动new数据而导致的潜在内存泄漏。

std::vector<char> getData() {
  std::vector<char> res;
  // fill vector with data of your choosing using push_back etc.
  return res;
}

如果您必须使用c风格数组,另一个选择是使用作为GSL(指南支持库)下CppCoreGuidelines项目的一部分发布的新array_view类。

见:https://github.com/Microsoft/GSL

: https://github.com/isocpp/CppCoreGuidelines

但是,我建议您坚持使用std::vector,除非您有很好的理由(例如大型遗留代码库或与重要且不可更新的库进行互操作)使用c风格的数组。