在C++引物5版上。第12章。动态内存。显示std::unique_ptr
操作的表:
unique_ptr<T, D>
u2可以指向类型为T
的对象的空unique_ptr
。u2
将使用类型为D
的可调用对象来代替delete
来释放其指针。
unique_ptr<T, D> u(d)
空unique_ptr
,指向使用d
的T
类型的对象,该对象必须是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是一个巨大的修订版,有些功能没有加入。