我需要一个返回任意长度的数据块(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 ++中这被认为是“最干净”的方式?
答案 0 :(得分:2)
他们都不是。如果您正在使用C ++而不仅仅是C,请继续使用它提供的语义。
您真的想使用std::vector
,特别是std::vector<char>
。不要自己动手或处理C风格的东西,这是浪费时间。
答案 1 :(得分:1)
您有几种选择。正如评论者所提到的,大多数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风格的数组。