BadCats
@BadCats

Проблема с деструктором при использовании конструктора копирования?

Всем, добрый день! Возник следующий вопрос при изучении с++:
имеется класс Sea:
class Sea
{
private: 
	char* sea_name;
	int max_depth;
	double square;

public:

	void SetSeaName(const char* p)
	{
		if (strlen(p) != strlen(this->sea_name) || this->sea_name == nullptr)
		{
			delete[] this->sea_name;
			this->sea_name = new char[strlen(p) + 1];
		}
		strcpy(this->sea_name, p);
	}



	Sea(const char* arr, int d, double s) :max_depth(d), square(s)
	{
		this->sea_name = new char[strlen(arr) + 1];
		strcpy(this->sea_name, arr);
	
		
	}

	  Sea(int d, double s) :Sea("cde", d, s)
	{


	}
	~Sea()
	{
		delete[] sea_name;
		cout << "Destructor" << endl;
	}

	Sea()
	{
		this->sea_name = new char[4];
		strcpy(this->sea_name, "abc");
		this->max_depth = 1000;
		this->square = 100000;
	}

	//Конструктор копирования
	Sea(const  Sea&  param):sea_name(param.sea_name),max_depth(param.max_depth),square(param.square)
	{
		cout << "Copy Constructor is worked!" << endl;


		
	}

};

- он содержит в себе несколько конструкторов, в том числе и конструктор копирования.
В main создаю несколько экземпляров класса:
int main()
{
	setlocale(LC_ALL, NULL);
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	{
		Sea s1();
		Sea s2("aaaa", 1000, 2000.5);
		Sea s3(1000, 200.5);
		Sea s4=s3;
		Sea s5(100,100);

	}
	Sea* s4 = new Sea();
	s4->~Sea();

	system("pause");
	return 0;
}


Проблема возникает вот здесь:
Sea s4=s3; - при вызове деструктора s4. Не могу понять в чем проблема (Вернее догадываюсь, что проблема в том, что у s3 - деструктор - вызывается дважды, но не знаю как этого избежать - т.к здесь он так же вызовется
Sea s3(1000, 200.5);). Сколько смотрел примеров на просторах интернета - во всех, примерно так же и никаких проблем не возникает.
Подскажите пожалуйста. Заранее - спасибо!
  • Вопрос задан
  • 83 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Не с деструктором у тебя проблема, а с тем, что ты не выделил память для sea_name в конструкторе копирования, а просто присвоил значение указателя из копируемого объекта.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Тут есть ещё более глобальная проблема, чем просто не выделение памяти в конструкторе копирования: использование char*. Вы же пишете на C++, а не на C с классами. Используйте std::string для sea_name. Вы увидите, насколько проще, короче и безопаснее станет ваш код.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы