Существует ли текстовый объект динамического размера с конструктором копирования, тривиальным оператором присваивания и тривиальным деструктором?
Динамический размер, нет. Чтобы что-то имело тривиальный деструктор, требуется, чтобы деструктор объекта был неявным (или по умолчанию), а любые нестатические объекты-члены также имели неявные (или по умолчанию) деструкторы. Поскольку для всего, что выделяется динамически, потребуется 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