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

时间:2008-11-20 01:37:48

标签: c++ boost refcounting

我想知道为什么shared_ptr没有隐式构造函数。这里没有提及这一事实:Getting a boost::shared_ptr for this

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

#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 */

5 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:5)

合乎逻辑的原因是:

  • 调用delete运算符并非隐含在C ++
  • 创建任何拥有的智能指针shared_无论如何,scoped_无论如何,......)实际上是{{延迟)调用{{ 1}}运算符

答案 2 :(得分:2)

很长一段时间潜伏着,还有一名三年级的软英国学生, Haphazard猜测是,阻止你尝试将'自然'指针转换为shared_ptr,然后释放指向的对象,而不让shared_ptr知道dealloc。

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

答案 3 :(得分:-1)

int main() {

    int foo = 5;
    fun(&foo);

    cout << foo << endl; // ops!!

    return 0;
}

答案 4 :(得分:-3)

我认为没有理由在这个构造函数中使用。

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