2008-11-20 42 views
4

我想知道为什么shared_ptr没有隐含的构造函数。它不会是暗示这里的事实:Getting a boost::shared_ptr for this为什么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 */ 

回答

8

在这种情况下,shared_ptr会尝试释放您的堆栈分配int。你不希望这样,所以显式构造函数在那里让你思考它。

2

长时间潜行者,和第3年软式英语学生在这里, 冒险猜测会阻止你尝试将一个'自然'指针转换为shared_ptr,然后释放指向的对象,而shared_ptr不知道dealloc。

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

-1
int main() { 

    int foo = 5; 
    fun(&foo); 

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

    return 0; 
} 
+1

我不明白它是如何从根本上`d elete &foo;` – curiousguy 2011-10-07 14:40:40

-3

我认为没有理由在此构造函数中有明确的定义。

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

+0

@vBx:在提到的示例[1](http://stackoverflow.com/questions/304093/why-shared-ptr-has-an-explicit-constructor/304183#304183)偏移地址运算符(&)已经被用来通过指针传递参数给函数。应该改用参考。 – 2011-06-04 10:19:53

6

逻辑的原因是:

  • 调用delete运营商是不是在C++
  • 创造任何拥有智能指针的(shared_什么,scoped_什么,...)是隐式真的(延迟)拨打delete运营商
相关问题