c++ - shared_ptr赋值 - std::shared_ptr用法




为什么shared_ptr有一个显式的构造函数 (4)

我想知道为什么shared_ptr没有隐式的构造函数。 事实并非如此: 为此获取boost :: shared_ptr

(我找出原因,但认为这将是一个有趣的问题,无论如何发布。)

#include <boost/shared_ptr.hpp>
#include <iostream>

using namespace boost;
using namespace std;

void fun(shared_ptr<int> ptr) {
    cout << *ptr << endl;
}

int main() {
    int foo = 5;
    fun(&foo);
    return 0;
}

/* shared_ptr_test.cpp: In function `int main()':
 * shared_ptr_test.cpp:13: conversion from `int*' to non-scalar type `
 *  boost::shared_ptr<int>' requested */

在这种情况下,shared_ptr会试图释放你的堆栈分配int。 你不会想要的,所以显式的构造函数在那里让你思考。


很长一段时间的潜伏者,还有一个三年级的软件学生,Haphazard猜测会阻止你尝试将一个“自然”指针转换为shared_ptr,然后释放指向的对象,而shared_ptr不知道dealloc。

(另外,引用计数问题等等等等)。


我认为在这个构造函数中没有任何明确的理由。

提到错误使用偏移地址运算符(&)的例子没有意义,因为在现代C ++中没有地方使用这样的运算符。 除了赋值/比较运算符中的这种惯用代码为“this ==&other”,也许还有一些测试代码。


合乎逻辑的原因是:

  • 调用delete操作符并不隐含在C ++中
  • 创建任何拥有智能指针shared_ whatever, scoped_ whatever,...) 实际上是一个(延迟)调用delete操作符




refcounting