Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 智能指针的投射_C++_C++11 - Fatal编程技术网

C++ 智能指针的投射

C++ 智能指针的投射,c++,c++11,C++,C++11,我已经使用原始指针有一段时间了,现在我正在尝试使用智能指针 如果ClassB是ClassA的子级 我可以用原始指针来做这件事 ClassA* ptr = new ClassB; 这条线是否等同于上面这条线 std::shared_ptr<ClassA> ptr = std::shared_ptr<ClassB>(new ClassB); std::shared_ptr ptr=std::shared_ptr(新B类); 当ptr超出范围时,内存将被清除。您在代码中

我已经使用原始指针有一段时间了,现在我正在尝试使用智能指针

如果ClassB是ClassA的子级

我可以用原始指针来做这件事

 ClassA* ptr = new ClassB;
这条线是否等同于上面这条线

std::shared_ptr<ClassA> ptr = std::shared_ptr<ClassB>(new ClassB);
std::shared_ptr ptr=std::shared_ptr(新B类);

当ptr超出范围时,内存将被清除。

您在代码中尝试过吗

我想你可以直接做
std::shared_ptr ptr(新类b)

有点像

这是因为
std::shared_ptr
比原始指针慢。如果您将共享指针的副本传递到其他地方,对象将不会被释放,但一旦指向它的所有共享指针都消失,它将被释放

此外,参考计数器跟踪器是安全的线程

同样
ClassA
不需要虚拟析构函数,共享指针才能正常工作

正如您可以想象的那样,这些功能成本高昂

如果需要与原始指针相同的性能,可以通过利用
std::unique\u ptr
来实现。尽管如此,它是不可复制的,并且它的使用可能会混淆新引入到C++11中的内容


除此之外,建议使用
std::make_shared
std::make_unique
初始化所述智能指针

,构造函数9执行此转换。您可能希望使用
std::make_shared
,而不是传递
ClassB*
@Sam您可以将一个唯一指针移动到另一个,或者生成一个新的唯一指针并复制数据。但是您不能复制。@sam显然,您也可以从唯一指针获取原始指针值(否则,例如,您不能将其传递给获取该指针的函数)。当释放分配时(通过unique_ptr超出范围),指针值的这些副本就变成了悬空指针,就像使用普通原始指针一样(这就是为什么在需要更长的生命周期时使用shared_ptr)。使用智能指针时,您还需要计算智能指针的类型对其使用方式的暗示。我看到一个
共享的\u ptr
,我假设多个对象在它存储的资源中拥有所有权。它不会在一个容易预测的时间表上被销毁。如果它不用于共享,我将在如何与代码交互方面做出错误的决定。如果我看到一个
独特的\u ptr
我就知道它的所有者是谁。如果我得到一个参考,我知道我不必担心它。其他人有那份工作。对于原始指针,您对所有权一无所知。方便阅读:@sam对我来说很好:。也就是说,我更喜欢这样: