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

論理的な理由は次のとおりです。

  • 演算子の呼び出しはdeleteC++ では暗黙的ではありません
  • 所有するスマート ポインター( shared_whatever、scoped_whatever、...)の作成は、実際にはオペレーターへの (遅延した) 呼び出しです。delete
于 2011-10-07T14:38:13.050 に答える
2

長年の潜伏者であり、ここで3年生のsoft engの学生である場合、Haphazardは、shared_ptrがdeallocについて知らなくても、「自然な」ポインタを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 に答える