2015-09-27 5 views
0

Мне нужна функция, которая возвращает кусок данных (char *) с произвольной длиной. Вызывающему функции требуется как массив, так и размер массива. Этот массив может динамически выделяться внутри функции или передаваться в качестве аргумента. Существует несколько способов достижения одного и того же результата. Теперь мне было интересно, что считается «самым чистым» способом сделать это на C++. Я приведу примеры ниже.Каков самый чистый способ извлечения массива?

Возврат массива, изменить длину (в качестве ссылки):

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

длина Return, изменить массив (в качестве ссылки):

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++?

+3

Самый чистый путь - это, вероятно, использование 'std :: vector' вместо массива c-style. – wimh

+5

Самый чистый способ - использовать 'std :: vector' и вернуть его по значению. –

ответ

1

У вас есть несколько вариантов. Как отмечают комментаторы, большинство способов C++ - использовать стандартные контейнеры. Для этого они и есть. Таким образом, вы также избегаете потенциальной утечки памяти, вызванной вручную данными new.

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

Другой вариант, если вы MUST использовать массивы с стиля является использование нового array_view класса опубликован в рамках проекта CppCoreGuidelines под GSL (Руководство библиотеки поддержки).

См: https://github.com/Microsoft/GSL

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

Однако я бы рекомендовал придерживаться std::vector, если у вас есть очень веские причины (например, большая унаследованный код базы или взаимодействующий с важнейшими и unupdateable библиотек) в используйте c-style массивы.

2

Ни один из них. Если вы используете C++, а не только C, продолжайте использовать семантику, которую она предлагает.

Вы действительно хотите использовать std::vector, в частности std::vector<char>. Не сворачивайте себя или не разбирайтесь в материалах C-стиля, это пустая трата времени.