у меня есть char*
массив, который new
и инициализировал в функции. Обычно я бы использовал std::string
но массив завершается нулем, возможно, с более чем одним '\0'
и я хотел бы захватить в натуральную величину.
Как это, вызывающий должен помнить delete[]
char *
когда он использует эту функцию. Я хотел бы очистить интерфейс так, чтобы delete[]
вызывается в деструкторе, когда он выходит из области видимости, но я не уверен, что использовать. Есть ли умный указатель, чем можно взять char *
?
Редактировать:
Я бы не использовал std::string
поскольку было бы неясно, что это не строка с нулевым окончанием в стиле C. Могу ли я использовать boost::scoped_array<char>
за это? поскольку scoped_array
не подлежит копированию, как я могу вернуть его из функции, которая его создала?
Это то, что ОО программирование это все о. использование std::string
как комментарий выше, или создайте класс, который обрабатывает данные для вас:
class MyObj {
private:
char *data;
int len;
public:
MyObj( const char *data, int len ) {
this->data = new char[...
// do what you need here
}
const char* getStr() const {
return data;
}
int getLen() const {
return len;
}
~MyObj() {
delete [] data;
}
};
Вы, вероятно, также захотите реализовать конструктор копирования и оператор присваивания (или приватизировать их использование) …
В качестве альтернативы, используйте std :: string в качестве базовой реализации, но показывайте только то, что и как вы хотите:
class MyObj : private std::string {
public:
// whatever you want here
const char* data() {
return c_str();
}
int length() const {
return std::string::length();
}
};
До 2011 года ваш выбор для возврата динамического массива из функции был std::string
, std::vector<char>
или же boost::shared_array<char>
, В современной реализации вы также можете использовать std::unique_ptr<char[]>
,
Я бы порекомендовал использовать std::string
представлять строку.