Я пытаюсь понять концепцию конструктора копирования. Я использовал этот пример:Функция конструктора копирования
#include <iostream>
using namespace std;
class Line
{
public:
int GetLength();
Line(int len);
Line(const Line &obj);
~Line();
private:
int *ptr;
};
Line::Line(int len)
{
ptr = new int;
*ptr = len;
};
Line::Line(const Line &obj)
{
cout << "Copying... " << endl;
ptr = new int;
*ptr = *obj.ptr;
};
Line::~Line()
{
delete ptr;
};
int Line::GetLength()
{
return *ptr;
}
int main()
{
Line line1 = Line(4);
cout << line1.GetLength() << endl;
Line line2 = line1;
line1.~Line();
cout << line2.GetLength() << endl;
return 0;
}
Вопрос в том, почему я получаю ошибку времени выполнения здесь? Если я определил конструктор копирования, который выделяет память для нового ptr и назначил строку 1 на строку 2, не означает ли это, что эти два являются отдельными объектами? Разрушив строку1, я, очевидно, испортил строку2, или я неправильно использую вызов деструктора?
Это хорошая привычка реализовать оператор присваивания. Но в вашем случае проблема заключается в явном вызове деструктора, ваш указатель будет удален дважды, что приведет к ошибке выполнения. –
Почему вы делаете это 'line1. ~ Line();'? Кто вам сказал? – juanchopanza
Это просто для практики, я попробовал это, чтобы увидеть, что происходит с объектом line2, когда я разрушаю строку1. Я пришел из мира C# :) – omegasbk