c++ - 智能指针的转换

标签 c++ c++11

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

如果 ClassB 是 ClassA 的子级。

我可以使用原始指针来做到这一点。

 ClassA* ptr = new ClassB;

这行与上面的行等效吗?

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

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

最佳答案

有点是的。

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

此外,引用计数器跟踪器是安全线程的。

此外,ClassA 不需要有虚拟析构函数即可使共享指针正常工作。

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

如果您需要与原始指针相同的性能,可以通过使用 std::unique_ptr 来实现。不过,它是不可复制的,并且它的用法可能会混淆新引入的 C++11。

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

关于c++ - 智能指针的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57702591/

相关文章:

c++ - 将长整数转换为字符数组的最安全方法是什么

c++ - 用另一个一维数组替换二维数组的整行

c++ - 在 C++ 中写入 stderr 时调用函数?

c++ - 为什么编译器说 "candidate template ignored: couldn' t 推断模板参数 'InputIterator'“?

c++ - 将 C++ 游戏移植到 Objective-C

c++ - 使用数组作为元组成员 : Valid C++11 tuple declaration?

c++ - 任何人都可以解释 boost::thread 的这个意外结果吗?

c++ - 成员模板的别名模板

c++ - 这些 Visual Studio 2010 错误和警告的原因是什么?

c++ - 实例化具有回调函数类型的模板