Существует ли текстовый объект динамического размера с конструктором копирования, тривиальным оператором присваивания и тривиальным деструктором?
Динамический размер, нет. Чтобы что-то имело тривиальный деструктор, требуется, чтобы деструктор объекта был неявным (или по умолчанию), а любые нестатические объекты-члены также имели неявные (или по умолчанию) деструкторы. Поскольку для всего, что выделяется динамически, потребуется delete []
где-то в строке деструктора, вы не можете удовлетворить это ограничение.
Чтобы расширить вышеизложенное, рассмотрим (очень урезанный) пример того, что происходит в std::string
:
namespace std
{
// Ignoring templates and std::basic_string for simplicity
class string
{
private:
char* internal_;
// Other fields
public:
string(const char* str)
: internal_(new char[strlen(str) + 1])
{ }
};
}
Подумайте, что произойдет, если мы оставим деструктор по умолчанию: он уничтожит выделенные в стеке char *
(то есть сам указатель, а не то, на что он указывает). Это вызовет утечку памяти, так как теперь у нас есть выделенное пространство, на которое нет ссылок и, следовательно, оно никогда не может быть освобождено. Итак, нам нужно объявить деструктор:
~string()
{
delete[] internal_;
}
Однако при этом деструктор становится определяемым пользователем и, следовательно, нетривиальным.
Это будет проблемой для всего, что выделяется динамически. Обратите внимание, что мы не можем исправить это, используя что-то вроде shared_ptr
или vector<char>
в качестве переменной-члена; даже несмотря на то, что они могут быть выделены в стеке в нашем классе, внизу они просто заботятся об управлении памятью для нас: где-то рядом с ними есть new []
и соответствующий delete []
, поэтому у них будут нетривиальные деструкторы.
Чтобы удовлетворить это, вам нужно использовать массив char
, выделенный стеком. Это означает отсутствие динамического распределения и, следовательно, фиксированный размер.
10.09.2013
the pointer cannot be fully released
, можешь дать подробное объяснение? 24.04.2014