Как инициализировать unique_ptr, ...
От: Аноним  
Дата: 24.03.14 09:44
Оценка: -1
... который является полем класса? В списке инициализации конструктора нельзя, т.к. на этот момент еще неизвестен размер буффера, который требуется выделить. А оператора присвоения у него нет.
Re: Как инициализировать unique_ptr, ...
От: Sanik Россия http://sergeysthoughts.blogspot.com/
Дата: 24.03.14 09:55
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

А>... который является полем класса? В списке инициализации конструктора нельзя, т.к. на этот момент еще неизвестен размер буффера, который требуется выделить. А оператора присвоения у него нет.


как так нет?
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re: Как инициализировать unique_ptr, ...
От: uzhas Ниоткуда  
Дата: 24.03.14 10:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>... который является полем класса? В списке инициализации конструктора нельзя, т.к. на этот момент еще неизвестен размер буффера, который требуется выделить. А оператора присвоения у него нет.


используйте метод 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 []

успехов
Re[2]: Как инициализировать unique_ptr, ...
От: TarasB  
Дата: 24.03.14 12:07
Оценка:
Здравствуйте, uzhas, Вы писали:

U>используйте метод reset


Вот кстати, а с чего бы в stl не ввести стандартный reset для всех объектов?
Типа
std::reset(a, arg1, arg2, arg3);
означает то же самое, что и
a.~A();
new(&a) A(arg1, arg2, arg3);

Это избавит от необходимости в каждом объекте писать отдельно и конструктор от нескольких параметров, и метод, который делает почти то же самое (с точностью до освобождения захваченных ресурсов).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.