примр 5 издание. конструктор unique_ptr из пользовательской функции удаления - PullRequest
0 голосов
/ 30 октября 2019

На 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?

1 Ответ

2 голосов
/ 30 октября 2019

std::unique_ptr не имеет конструктора, который принимает только пользовательское удаление. Вам нужно будет передать nullptr в качестве значения указателя, если вы хотите иметь нулевой указатель с пользовательским средством удаления.

По второму пункту это правильно. Они не добавляли make_unique до c ++ 14, по сути, ни по какой другой причине, кроме того, что C ++ 11 был огромной ревизией, и некоторые функции его не сделали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...