primr 5版.自定义deleter函数的unique_ptr构造函数



在C++引物5版上。第12章。动态内存。显示std::unique_ptr操作的表:

unique_ptr<T, D>u2可以指向类型为T的对象的空unique_ptru2将使用类型为D的可调用对象来代替delete来释放其指针。

unique_ptr<T, D> u(d)unique_ptr,指向使用dT类型的对象,该对象必须是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重写的吗?

std::unique_ptr没有只接受自定义deleter的构造函数。如果您想要一个带有自定义deleter的空指针,则必须将nullptr作为指针值传递。

关于你的第二点,这是正确的。他们直到c++14才添加make_unique,原因无非是c++11是一个巨大的修订版,有些功能没有加入。

相关内容

  • 没有找到相关文章

最新更新