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_ptrsizi 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 Testyok edildiğinde, aynı zamanda işaretçiyi de yok eder. İkinciniz Testyok 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_ptrburada 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_ptrbu tür durumlarda kullanın.