На C ++ учебник для начинающих 5 издание. Глава 12. Динамическая память. Таблица, которая показывает std::unique_ptr
операции:
unique_ptr<T, D>
u2 Нуль unique_ptr
с, которые могут указывать на объекты типа T
. u2
будет использовать вызываемый объект типа D
вместо delete
для освобождения своего указателя.
unique_ptr<T, D> u(d)
Null unique_ptr
, который указывает на объекты типа T
, использующие d
, который должен быть объектом типа D
вместо delete
.
Но если я попытаюсь создать такой как:
void cust_del(std::string* pStr){
std::cout << *pStr + " destroying..." << std::endl;
delete pStr;
}
int main(){
{// new scope
std::unique_ptr<std::string, void(*)(std::string*)> u(cust_del); // error
std::unique_ptr<std::string, void(*)(std::string*)> u(new string("Hello unique!"), cust_del); // ok
// or
// std::unique_ptr<std::string, decltype(&cust_del)> u(new string("Hello unique!"), cust_del);
}
}
Так как яЯ вижу, что невозможно создать unique_ptr
только из пользовательской функции удаления.
- И последний момент: там сказано:
В отличие отshared_ptr, нет библиотечной функции, сравнимой с make_shared, которая возвращает unique_ptr. Вместо этого, когда мы определяем unique_ptr, мы связываем его с указателем, возвращаемым new. Как и в случае с shared_ptrs, мы должны использовать прямую форму инициализации:
Но есть std::make_unique
. Это потому что make_unique
добавлено C ++ 14 и книга была переписана для C ++ 11?