unique_ptr
kopyalanamaz, sadece taşınabilir.
Bu, ikinci örneğinizde yalnızca taşınabilir olan ve kopyalanamayan Test'i doğrudan etkileyecektir.
Aslında, unique_ptr
sizi büyük bir hatadan koruyacak şekilde kullanmanız iyidir .
Örneğin, ilk kodunuzla ilgili ana sorun, işaretçinin asla silinmemesidir ki bu gerçekten çok kötüdür. Söyle, bunu şu şekilde düzelteceksin:
class Test
{
int* ptr; // writing this in one line is meh, not sure if even standard C++
Test() : ptr(new int(10)) {}
~Test() {delete ptr;}
};
int main()
{
Test o;
Test t = o;
}
Bu da kötü. Kopyalarsan ne olur Test
? Aynı adresi gösteren bir işaretçiye sahip iki sınıf olacaktır.
Biri Test
yok edildiğinde, aynı zamanda işaretçiyi de yok eder. İkinciniz Test
yok edildiğinde, işaretçinin arkasındaki belleği de kaldırmaya çalışacaktır. Ancak zaten silindi ve bazı kötü bellek erişim çalışma zamanı hatası alacağız (veya şanssızsak tanımlanmamış davranış).
Dolayısıyla, doğru yol, ya kopya yapıcıyı uygulamak ve atama işlecini kopyalamaktır, böylece davranış açık olur ve bir kopya oluşturabiliriz.
unique_ptr
burada bizden çok ileride. Anlamsal anlamı vardır: " Ben öyleyim unique
, bu yüzden beni öylece kopyalayamazsınız. " Bu nedenle, elimizdeki operatörleri şimdi uygulama hatasından bizi engelliyor.
Özel davranış için kopyalama yapıcı ve kopyalama atama işleci tanımlayabilirsiniz ve kodunuz çalışacaktır. Ama sen, haklı olarak öyle (!), Bunu yapmaya zorlandın.
Hikayenin ahlaki: her zaman unique_ptr
bu tür durumlarda kullanın.