Лучший интерфейс для создания ресурса и возврата его для освобождения вызывающей стороной

у меня есть char* массив, который newи инициализировал в функции. Обычно я бы использовал std::string но массив завершается нулем, возможно, с более чем одним '\0' и я хотел бы захватить в натуральную величину.

Как это, вызывающий должен помнить delete[] char * когда он использует эту функцию. Я хотел бы очистить интерфейс так, чтобы delete[] вызывается в деструкторе, когда он выходит из области видимости, но я не уверен, что использовать. Есть ли умный указатель, чем можно взять char *?

Редактировать:

Я бы не использовал std::string поскольку было бы неясно, что это не строка с нулевым окончанием в стиле C. Могу ли я использовать boost::scoped_array<char> за это? поскольку scoped_array не подлежит копированию, как я могу вернуть его из функции, которая его создала?

1

Решение

Это то, что ОО программирование это все о. использование 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();
}
};
1

Другие решения

До 2011 года ваш выбор для возврата динамического массива из функции был std::string, std::vector<char> или же boost::shared_array<char>, В современной реализации вы также можете использовать std::unique_ptr<char[]>,

Я бы порекомендовал использовать std::string представлять строку.

0

По вопросам рекламы [email protected]