unique_ptr
не підлягає копіюванню, він лише переміщується.
Це безпосередньо вплине на Тест, який, на вашу думку, також може бути переміщеним і не піддається копіюванню.
Насправді добре, що ви користуєтесь тим, unique_ptr
що захищає вас від великої помилки.
Наприклад, головна проблема вашого першого коду полягає в тому, що вказівник ніколи не видаляється, що є насправді, дуже погано. Скажіть, ви вирішили це за допомогою:
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;
}
Це теж погано. Що станеться, якщо ви скопіюєтеTest
? Будуть два класи, які мають вказівник, який вказує на ту саму адресу.
Коли хтось Test
буде знищений, він також знищить покажчик. Коли ваша друга Test
знищена, вона також спробує видалити пам'ять за вказівником. Але його вже видалено, і ми отримаємо помилку виконання програми (або невизначена поведінка, якщо нам не пощастить).
Отже, правильний спосіб - це або реалізувати конструктор копій та оператор присвоєння копії, щоб поведінка була зрозумілою і ми могли створити копію.
unique_ptr
тут нам попереду. Він має семантичне значення: " Я є unique
, тому ви не можете просто скопіювати мене ". Отже, це заважає нам помилитися з тим, що зараз реалізувати операторів, що знаходяться під рукою.
Ви можете визначити конструктор копій та оператор призначення копій для особливої поведінки, і ваш код буде працювати. Але ви, справедливо так (!), Змушені це робити.
Мораль історії: завжди використовуйте unique_ptr
в подібних ситуаціях.