Student and Crash

Hello!

I receive the crash when the main returns:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

#include <string.h>
#include <iostream>

class Student
{
public:
    Student() :
        defaultSize( 30 ) // Это инициализация константы, которая задаёт размер строк поумолчанию
    {
        m_name = new char[defaultSize]; // Здесь получаем в наше распоряжение место для хранения 30 символов
        char *defaultName = "emptyName";
        strcpy( m_name, defaultName );
    }

    void setName( const char *name, int size ) // Функция, с помощью которой пользователь сможет задать имя указанной длины
    {
        delete m_name; // Освобождаем память, в которой хранилось предыдущее имя
        m_name = new char[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; // Этот указатель будет указывать на начало участка памяти, где будет храниться имя студента
    const int defaultSize; // Константа, которая хранит размер поумолчанию
};

int main()
{
    Student ivan;
    char *name;
    std::cout << ivan.name() << std::endl;

    // Демонстрация конструктора копирования
    Student ivan2( ivan );

    return 0;
}
Last edited on
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.
I thought that will be called "normal constructor" for ivan2 and then - "copy constructor". I understood! Thank you!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

#include <string.h>
#include <iostream>

class Student
{
public:
    Student() :
        defaultSize( 30 )
    {
        this->setDefaultName();
    }

    void setName( const char *name, int size )
    {
        delete m_name;
        m_name = new char[size];
        strcpy( m_name, name );
    }

    Student( const Student &student ) :
        defaultSize( 30 )
    {
        this->setDefaultName();
        this->setName( student.name(), strlen( student.name() ) );
    }

    char *name() const
    {
        return m_name;
    }

    ~Student()
    {
        delete m_name;
    }

private:
    void setDefaultName()
    {
        m_name = new char[defaultSize];
        char *defaultName = "emptyName";
        strcpy( m_name, defaultName );
    }

private:
    char *m_name;
    const int defaultSize;
};

int main()
{
    Student ivan;
    char *name;
    std::cout << ivan.name() << std::endl;

    Student ivan2( ivan );

    return 0;
}
Last edited on
Topic archived. No new replies allowed.