2016-04-11 14 views
4

以下のコードは実行時エラーを引き起こします。shared_ptrで参照カウントが機能しない

shared_ptrは同じメモリを保持しますが、それぞれのカウントは1です。

したがって、共有ポインタはそれぞれ異なるため、範囲外になるとブロックを解放しようとするため、ヒープが破損します。私の質問はこれを避ける方法ですか?

はちょうど私がそれを宣言しなければならない非交渉でこの

shared_ptr<int> x(p); 

のような宣言を追加します。

#include <iostream> 
#include <memory> 
using namespace std; 
int main() 
{ 
    int* p = new int (10); 
    shared_ptr<int> a (p); 
    shared_ptr<int> b (p); 
    shared_ptr<int> c (p); 
    shared_ptr<int> d (p); 
    cout<<"Count : "<<a.use_count()<<endl; 
    cout<<"Count : "<<b.use_count()<<endl; 
    cout<<"Count : "<<c.use_count()<<endl; 
    cout<<"Count : "<<d.use_count()<<endl; 
    return 0; 
} 
+4

'shared_ptr b = a;'など?それは実際に* shared *ポインタを持つ唯一の方法です。そうでなければ、新しいスマートポインタをまったく使用しないかもしれません。 –

+0

また、単にスマートポインタを「自己削除ポインタ」と見なすのではなく、*所有権*の観点から見ることをお勧めします。リソースや物は一度に1人の所有者しか持てませんか?そして 'std :: unique_ptr'を使います。リソースや物に複数の同時所有者がいますか?次に 'std :: shared_ptr'を使います。 –

+0

最後に、プログラミングでは* nothing *は "non negotiable"です。現在使用しているプログラミング言語やフレームワークの機能が要件に合わない場合は、要件または言語/フレームワークのいずれかを変更する必要があります。 –

答えて

10

ポインタの所有権がある場合は、スマートポインタを生のポインタから作成することができます。スマートポインタを作成すると、所有権がスマートポインタに渡されます。所有権がなくなったので、生ポインタから追加のスマートポインタを作成することはできません。

すでに共有ポインタが所有/管理されているメモリへの共有のポインタを取得し、既存の共有ポインタからコピーする必要がありますするには:あなたは、単に生のポインタから複数の共有のポインタを作成した場合

shared_ptr<int> b = a; 
shared_ptr<int> c = a; 
// .... 

、それらの共有ポインターのどれもお互いの存在を知りませんし、それらのすべてがその記憶の唯一の所有者であると信じて、あなたが説明する問題が発生します。

関連する問題