关于 C++ 入门 5 版。第 12 章动态内存。显示std::unique_ptr
操作的表:
unique_ptr<T, D>
u2 Nullunique_ptr
可以指向类型的对象T
。u2
将使用一个可调用的对象类型D
代替delete
来释放它的指针。
unique_ptr<T, D> u(d)
空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 不同,没有任何库函数可与返回 unique_ptr 的 make_shared 相媲美。相反,当我们定义一个 unique_ptr 时,我们将它绑定到一个由 new 返回的指针。与 shared_ptrs 一样,我们必须使用直接初始化形式:
但是有std::make_unique
。这是因为make_unique
是由 C++14 添加的,并且该书已针对 C++11 重写?
std::unique_ptr
没有只接受自定义删除器的构造函数。nullptr
如果您想要带有自定义删除器的空指针,则必须将其作为指针值传递。
关于你的第二点,这是正确的。他们直到 C++14 才添加 make_unique,除了 C++11 是一个巨大的修订版并且某些功能没有加入之外,没有其他原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句