C++ paylaşımlı_ptr

C Shared_ptr



NS share_ptr işaretçi tarafından oluşturulan nesnenin paylaşılan sahipliğini içeren bir tür C++ akıllı işaretçisidir. İşaretçiyi başka bir nesneye kaydederken nesnenin sahipliğini paylaşır ve paylaşılan referans sayacı sahiplerin sayısını sayar. NS share_ptr nesneyi kopyaladıktan sonra referans sayacını bir artırır ve nesneyi yok ettikten sonra referans sayacını bir azaltır. Nesnenin sahip olduğu bellek, son nesneye aitse yeniden tahsis edilir. share_ptr yok edilir veya Sıfırla() nesneye başka bir işaretçi atamak için işlev çağrılır. Ne zaman share_ptr herhangi bir nesneye sahip değilse, boş bir paylaşılan işaretçi olarak adlandırılır. Farklı kullanımları share_ptr bu eğitimde gösterilmiştir.

Örnek 1: Paylaşılan İşaretçiyi Farklı Şekillerde Bildirin

Aşağıdaki örnekte, paylaşılan bir işaretçiyi bildirmenin üç farklı yolu gösterilmiştir. Kodda, yapıcısı ve genel yöntemi olan bir sınıf bildirildi. Oluşturucu ile yeni bir paylaşılan nesne oluşturulduğunda, yapıcı bir mesaj yazdıracaktır. NS Görüntülemek() yöntemi, çağrılan paylaşılan işaretçi nesnesine dayalı olarak mesajları yazdırır. Burada, ilk paylaşılan işaretçi nesnesi, kurucu çağrılmadan yaratılmıştır. İkinci paylaşılan işaretçi nesnesi, kurucu çağrılarak yaratılmıştır. Üçüncü paylaşılan işaretçi, ilk paylaşılan işaretçi atanarak oluşturulmuştur. NS Görüntülemek() yöntemi, üç paylaşılan işaretçi nesnesi kullanılarak üç kez çağrıldı.







//Gerekli kitaplıkları dahil et

#Dahil etmek

#Dahil etmek

kullanmanamespacestd;

// sınıfı tanımla
sınıfSınıfım{
halka açık:
//Yapıcıyı bildir
Sınıfım() {
maliyet<<'Yapıcı denir. ';
}
// Metni yazdırmak için bir yöntem bildir
voidEkran(dize str)
{
maliyet<<'Display() yöntemi, ' öğesinden çağrılır.<<P<<' Işaretçi. ';
}
};

()
{
// Oluşturucuyu çağırmadan shared_ptr'yi başlat
share_ptr p1=make_shared();
p1->Görüntülemek('ilk');
// yapıcıyı çağırarak shared_ptr'yi başlatın
share_ptr p2=share_ptr(yeniSınıfım);
p2->Görüntülemek('ikinci');

// Shared_ptr'yi atamaya göre başlat
share_ptr p3=p1;
p3->Görüntülemek('üçüncü');
dönüş0;
}

Çıktı:



Yukarıdaki kodu çalıştırdıktan sonra aşağıdaki çıktı görünecektir. Yapıcı, yalnızca ikinci nesne oluşturma sırasında aradı. Bu nedenle, yapıcının mesajı yalnızca bir kez yazdırıldı:







Örnek 2: Depolanan Paylaşılan İşaretçi Konumunu Yazdırın

get() işlevi paylaşılan işaretçi, saklanan, paylaşılan işaretçi konumunu döndürmek için kullanılır. Aşağıdaki örnek, sınıf ve işlev tarafından oluşturulan depolanmış, paylaşılan işaretçilerin konumunu yazdıracaktır. Burada, paylaşılan bir işaretçi oluşturmak için kullanılacak bir kurucuya sahip bir sınıf tanımlanmıştır. Paylaşılan bir işaretçi oluşturmak ve get() işlevini kullanarak paylaşılan işaretçi konumunu yazdırmak için bir işlev bildirildi. Bu kodda, sınıf kullanılarak birinci paylaşılan işaretçi, işlev kullanılarak ikinci paylaşılan işaretçi ve birinci işaretçi atanarak üçüncü paylaşılan işaretçi oluşturuldu.

//Gerekli kitaplıkları dahil et

#Dahil etmek

#Dahil etmek

kullanmanamespacestd;

// sınıfı tanımla
sınıfSınıfım
{
halka açık:
//Yapıcıyı bildir
Sınıfım() {
maliyet<<'Yapıcı denir. ';
}
};
//İşaretçiyi başlatmak için işlevi tanımlayın
voidInit_shared_ptr()
{
share_ptr p2(yeniSınıfım);
maliyet<<p2.elde etmek() <<' ';
}

()
{
// yapıcıyı çağırarak shared_ptr'yi başlatın
share_ptr p1=share_ptr(yeniSınıfım);
maliyet<<p1.elde etmek() <<' ';

//Fonksiyonu çağırarak share_ptr'yi başlat
Init_shared_ptr();

// Shared_ptr'yi atamaya göre başlat
share_ptr p3=p1;
maliyet<<p3.elde etmek() <<' ';
dönüş0;
}

Çıktı:



Yukarıdaki kodu çalıştırdıktan sonra aşağıdaki benzer çıktı görünecektir. Çıktıda, birinci ve üçüncü paylaşılan işaretçiler için get() işlevinin döndürülen değeri aynıdır. Ancak, ikinci paylaşılan işaretçi farklıdır:

Örnek 3: Paylaşılan İşaretçi Nesnelerini Sayma

Aşağıdaki örnek, işaretçiyi oluşturup yok ettikten sonra paylaşılan bir işaretçi tarafından işaret edilen nesnelerin sayısını saymanın bir yolunu gösterir. Kodda yapıcısı olan bir sınıf bildirildi. İlk paylaşılan işaretçi sınıf kullanılarak, ikinci paylaşılan işaretçi ise ilk paylaşılan işaretçi kullanılarak oluşturulmuştur. Her iki paylaşılan işaretçi tarafından reset() işlevi çağrılmadan önce ve çağrıldıktan sonra işaret edilen nesnelerin sayısı daha sonra yazdırıldı.

//Gerekli kitaplıkları dahil et

#Dahil etmek

#Dahil etmek

kullanmanamespacestd;
// sınıfı tanımla
sınıfSınıfım{
halka açık:
//Yapıcıyı bildir
Sınıfım() {
maliyet<<'Yapıcı denir. ';
}
};
()
{
//Yapıcıyı çağırarak ilk shared_ptr'yi başlatın
share_ptr p1(yeniSınıfım);

// İlk işaretçi tarafından paylaşılan_ptr nesnelerinin sayısını görüntüleyin
maliyet<<'p1 işaret ediyor'<<p1.use_count() <<' nesne(ler). ';
//İlk shared_ptr'yi kullanarak ikinci shared_ptr'yi başlatın
share_ptr p2(p1);
//Birinci ve ikinci işaretçiler tarafından paylaşılan_ptr nesnelerinin sayısını görüntüleyin
maliyet<<'p2 işaret ediyor'<<p2.use_count() <<' nesne(ler). ';
maliyet<<'p1 işaret ediyor'<<p1.use_count() <<' nesne(ler). ';
//shared_ptr nesnesinden ilk işaretçinin sahipliğini kaldırın
p1.Sıfırla();
//İkinci işaretçi ile paylaşılan_ptr nesnelerinin sayısını göster
maliyet<<'p2 işaret ediyor'<<p2.use_count() <<' nesne(ler). ';
dönüş0;
}

Çıktı:

Yukarıdaki kodu çalıştırdıktan sonra aşağıdaki çıktı görünecektir. İlk işaretçi, p1 , oluşturulduktan sonra bir nesneye işaret ediyor. İkinci işaretçiyi oluşturduktan sonra, p2 , ilk işaretçiyi kullanarak, p1 , her iki işaretçi de işaretçiyi paylaşmak için iki nesneye işaret ediyor. İşaretçi için reset() işlevini çağırdıktan sonra, p1 , bir nesne yok edildi ve işaretçi, p2 , şimdi yalnızca bir nesneye işaret ediyor.

Çözüm:

C++'da paylaşılan bir işaretçi kullanmanın amaçları bu öğreticide basit örnekler kullanılarak açıklanmıştır. Farklı şekillerde paylaşılan işaretçiler oluşturma, paylaşılan işaretçi konumunu saklama ve paylaşılan işaretçiler tarafından işaret edilen nesnelerin sayısını sayma. Umarım C++ kodlayıcıları bu öğreticiyi okuduktan sonra kodlarında paylaşılan işaretçiyi kullanabilirler.