#include <string.h>
#include <iostream>
class Student
{
public:
Student() :
defaultSize( 30 ) // Это инициализация константы, которая задаёт размер строк поумолчанию
{
m_name = newchar[defaultSize]; // Здесь получаем в наше распоряжение место для хранения 30 символов
char *defaultName = "emptyName";
strcpy( m_name, defaultName );
}
void setName( constchar *name, int size ) // Функция, с помощью которой пользователь сможет задать имя указанной длины
{
delete m_name; // Освобождаем память, в которой хранилось предыдущее имя
m_name = newchar[size]; // Выделяем память для имени с указанным размером
strcpy( m_name, name ); // Копируем принятое имя во внутреннею переменную m_name
}
Student( const Student &student ) :
defaultSize( 30 )
{
this->setName( student.name(), strlen( student.name() ) );
}
char *name() const
{
return m_name;
}
~Student()
{
delete m_name; // Освобождаем память, в котором хранилось имя
}
private:
char *m_name; // Этот указатель будет указывать на начало участка памяти, где будет храниться имя студента
constint defaultSize; // Константа, которая хранит размер поумолчанию
};
int main()
{
Student ivan;
char *name;
std::cout << ivan.name() << std::endl;
// Демонстрация конструктора копирования
Student ivan2( ivan );
return 0;
}
When you copy-construct ivan2, the first thing you do is call setName(). That tries to delete the "old" m_name, which has a garbage value. I imagine that could cause the crash.