Yapıcısı unique_ptr<T>tip bir nesnenin bir ham bir işaretçi kabul T(böylece, bir kabul T*).
İlk örnekte:
unique_ptr<int> uptr (new int(3));
İşaretçi, bir newifadenin sonucudur , ikinci örnekte ise:
unique_ptr<double> uptr2 (pd);
İşaretçi pddeğişkende saklanır .
Kavramsal olarak, hiçbir şey değişmez ( unique_ptrham bir işaretçiden bir a oluşturuyorsunuz), ancak ikinci yaklaşım potansiyel olarak daha tehlikelidir, çünkü örneğin şunları yapmanıza izin verir:
unique_ptr<double> uptr2 (pd);
unique_ptr<double> uptr3 (pd);
Böylece , aynı nesneyi etkili bir şekilde kapsayan (böylece benzersiz bir göstericinin anlamını ihlal eden) iki benzersiz işaretçiye sahip olmak .
Bu nedenle, benzersiz bir işaretçi oluşturmanın ilk biçimi mümkün olduğunda daha iyidir. Dikkat edin, C ++ 14'te şunları yapabileceğiz:
unique_ptr<int> p = make_unique<int>(42);
Hangisi daha net ve daha güvenli. Şimdi bu şüphenizle ilgili olarak:
Benim için de net olmayan, bu şekilde ifade edilen işaretçilerin, "normal" bir şekilde açıklanan işaretçilerden nasıl farklı olacağıdır.
Akıllı işaretçilerin nesne sahipliğini modellemesi ve o nesneye son (akıllı, sahip olma) işaretçi kapsam dışına çıktığında otomatik olarak sivri uçlu nesneyi yok etmeye özen göstermesi gerekiyor.
Bu şekilde delete, dinamik olarak tahsis edilen nesneler üzerinde yapmayı hatırlamanıza gerek kalmaz - akıllı işaretçinin yıkıcısı bunu sizin için yapar - ya da zaten yok edilmiş bir nesneye (sarkan) bir işaretçiye başvurmayacağınız konusunda endişelenmenize gerek kalmaz:
{
unique_ptr<int> p = make_unique<int>(42);
}
Şimdi unique_ptr, benzersiz mülkiyeti modelleyen akıllı bir işaretçidir, yani programınızda herhangi bir zamanda , sivri uçlu nesneye yalnızca bir (sahip olan) işaretçi olacaktır - bu nedenle unique_ptrkopyalanamaz.
Akıllı işaretçileri, uymanızı gerektirdikleri örtük sözleşmeyi bozmayacak şekilde kullandığınız sürece, hiçbir belleğin sızdırılmayacağına dair garantiye sahip olacaksınız ve nesneniz için uygun sahiplik politikası uygulanacaktır. Ham işaretçiler size bu garantiyi vermez.
new int(3)inttıpkıpdyeniye bir gösterici gibi yeniye bir işaretçi döndürürdouble.