... который является полем класса? В списке инициализации конструктора нельзя, т.к. на этот момент еще неизвестен размер буффера, который требуется выделить. А оператора присвоения у него нет.
Здравствуйте, <Аноним>, Вы писали:
А>... который является полем класса? В списке инициализации конструктора нельзя, т.к. на этот момент еще неизвестен размер буффера, который требуется выделить. А оператора присвоения у него нет.
как так
нет?
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Здравствуйте, Аноним, Вы писали:
А>... который является полем класса? В списке инициализации конструктора нельзя, т.к. на этот момент еще неизвестен размер буффера, который требуется выделить. А оператора присвоения у него нет.
используйте метод
reset
//single object
std::unique_ptr<A> a;
a.reset(new A());
//array handling
std::unique_ptr<char[]> buffer;
buffer.reset(new char[255]);
раз вы упомянули буфер, то выше я дал пример того, как именно можно использовать unique_ptr для хранения массивов
будьте внимательны, вот пример неправильного использования:
std::unique_ptr<char> badBuffer;
badBuffer.reset(new char[255]);
дело в том, что классу unique_ptr надо подсказать, какую именно версию delete надо использовать для освобождения памяти и уничтожения объектов
ведь если мы выделяем объекты с помощью new, то должны удалять с помощью delete
а если выделяем с помощью
new [], то удалять следует через
delete []
подсказкой служит правильное указания шаблонного типа: unique_ptr<char> будет использовать delete,
unique_ptr<char[]> будет использовать
delete []
успехов
Здравствуйте, uzhas, Вы писали:
U>используйте метод reset
Вот кстати, а с чего бы в stl не ввести стандартный reset для всех объектов?
Типа
std::reset(a, arg1, arg2, arg3);
означает то же самое, что и
a.~A();
new(&a) A(arg1, arg2, arg3);
Это избавит от необходимости в каждом объекте писать отдельно и конструктор от нескольких параметров, и метод, который делает почти то же самое (с точностью до освобождения захваченных ресурсов).