2016-04-11 29 views
4

Aşağıdaki kod, çalışma zamanı hatasıyla sonuçlanır.başvuru sayımı shared_ptr içinde çalışmıyor.

Her bir shared_ptr aynı belleğe sahiptir, ancak yine de her biri için bir sayıdır.

Bu nedenle, her paylaşılan işaretçi farklıdır, bu nedenle kapsam dışına çıktığında bloğu boşaltmaya çalışırlar ve bu da yığının bozulmasına neden olur. Sorum şu nasıl önlenir?

Sadece bunu beyan etmek zorunda olmayan tartışılabilir olduğunu bu

shared_ptr<int> x(p); 

gibi beyanı eklemek istiyorum.

#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;' vb? * Paylaşılan * işaretçisine sahip olmanın tek yolu budur, aksi halde yeni akıllı işaretçileri kullanamazsınız. –

+0

Ayrıca, akıllı göstericilere sadece "kendi kendini saran işaretçiler" olarak değil, bunun yerine * sahiplik * açısından bakmanızı tavsiye ederim. Bir kaynak veya herhangi bir şey sadece bir seferde tek sahibi olabilir mi? Sonra 'std :: unique_ptr' kullanın. Bir kaynak veya şey birden fazla eşzamanlı sahip olabilir mi? Sonra 'std :: shared_ptr' kullanın. –

+0

Son olarak, programlamada * hiçbir şey * "pazarlık yapılamaz" dır. Kullandığınız mevcut programlama dilinin veya çerçevenin özellikleri gereksinimlerinize uymuyorsa, ya gereksinimler veya dil/çerçeve değiştirilmelidir. –

cevap

10

Şunlar sadece sandık Eğer pointer üzerinde mülkiyet varsa çiğ birinden akıllı işaretçi. Akıllı gösterici oluşturduğunuz anda, sahiplik akıllı göstericiye aktarılmış olacak. Artık sahip olmadığınızdan, ham işaretçiden ek akıllı işaretçiler oluşturamayabilirsiniz. ,

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

sadece çiğ pointer gelen birden çok paylaşılan işaretçileri oluşturursanız:

varolan paylaşılan pointer kopyalamak gerekir, paylaşılan bir işaretçi tarafından sahip olunan zaten yönetilen belleğe paylaşılan işaretçi/almak için o zaman bu paylaşımlı işaretçilerden hiçbiri birbirinin varlığını bilmeyecek ve hepsi de bu belleğin tek sahibi olacağına ve tanımladığınız problemlerin gerçekleşeceğine inanacaktır.