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

5 回答 5

9

在这种情况下,shared_ptr 将尝试释放您分配的 int 堆栈。您不希望这样,因此显式构造函数可以让您考虑它。

于 2008-11-20T02:30:01.140 回答
5

合乎逻辑的原因是:

  • 调用delete运算符在 C++ 中并不隐含
  • 创建任何拥有的智能指针shared_无论什么,scoped_随便......)实际上是对delete操作员的(延迟)调用
于 2011-10-07T14:38:13.050 回答
2

长期潜伏者,以及这里的 3 年级软工程学生,偶然的猜测是,阻止您尝试将“自然”指针转换为 shared_ptr,然后释放指向的对象,而 shared_ptr 不知道释放。

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

于 2008-11-20T02:05:21.440 回答
-1
int main() {

    int foo = 5;
    fun(&foo);

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

    return 0;
}
于 2008-11-20T02:37:09.817 回答
-3

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

提到的不正确使用偏移地址运算符 (&) 的示例没有任何意义,因为在现代 C++ 中没有使用此类运算符的地方。除了赋值/比较运算符中的惯用代码,例如“this == &other”,也许还有一些测试代码。

于 2011-03-25T07:06:13.750 回答