Форум программистов, компьютерный форум CyberForum.ru

Копирующий конструктор - C++

Восстановить пароль Регистрация
 
 
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
13.02.2014, 19:23     Копирующий конструктор #1
Добрый вечер всем!
Следущая проблема - решила создать свой персональный vector - int_array.
Но возникла проблема... Не пойму, как организован копирующий конструктор. Мои попытки его воссоздать приводят к утечке памяти.
Надеюсь, вы разъясните мне что к чему.
Заранее спасибо!
C++
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
class int_array
{
    int *mas, size, capacity;
public:
    int_array(): mas(0), size(0), capacity(0)
    {}
 
    ~int_array()
    {
        delete [] mas;
    }
    int_array(int n)
    {
        mas = new int[n];
        size = 0;
        capacity = n;
    }
    //copy constructor
    int_array(int_array& in)
    {
        *this = in;
    }
    int getSize() const
    {
        return size;
    }
    int getCapacity()
    {
        return capacity;
    }
 
    void resize(int n)
    {
        int *temp = new int[n];
        temp = mas;
        delete [] temp;
    }
    void push_back(int val)
    {
        if (size < capacity) mas[size++] = val; 
        // else throw ...  
    }
    void pop_back()
    {
        --size;
    }
    int operator[] (int n)
    {
        return mas[n];
    }
    int operator= (int n)
    {
        
    }
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.02.2014, 20:07     Копирующий конструктор #2
Цитата Сообщение от Тамика Посмотреть сообщение
//copy constructor
int_array(int_array& in)
{
*this = in;
}
Так указатель на память скопируется, а нужно содержимое этой памяти скопировать.

Добавлено через 4 минуты
Как-то так:
C++
1
2
3
4
5
6
7
8
9
//copy constructor
    int_array(const int_array& in)
    {
        size = in.size;
        capacity = in.capacity;
        mas = new int[capacity];
        for (int i = 0; i < size; ++i)
            mas[i] = in.mas[i];
    }
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
14.02.2014, 17:00  [ТС]     Копирующий конструктор #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Так указатель на память скопируется, а нужно содержимое этой памяти скопировать.

Добавлено через 4 минуты
Как-то так:
}[/CPP]
Не-а... Снова та же ошибка.
ДА и заносит в i не значения m, а мусор из кучи.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.02.2014, 17:07     Копирующий конструктор #4
Цитата Сообщение от Тамика Посмотреть сообщение
Не-а... Снова та же ошибка.
Та же - это какая?
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
14.02.2014, 17:10  [ТС]     Копирующий конструктор #5
Цитата Сообщение от Тамика Посмотреть сообщение
Мои попытки его воссоздать приводят к утечке памяти.
Вот эта.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.02.2014, 17:10     Копирующий конструктор #6
Цитата Сообщение от Тамика Посмотреть сообщение
ДА и заносит в i не значения m, а мусор из кучи.
О чём пишите? Кто-тот видит ваш код? Тут ясновидящих нет.
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
14.02.2014, 17:12  [ТС]     Копирующий конструктор #7
Цитата Сообщение от alsav22 Посмотреть сообщение
О чём пишите? Кто-тот видит ваш код? Тут ясновидящих нет.
А жаль.

Случайно не докопировала видимо.
Вот тестируемая програмка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    int_array m(5);
    for (int i =0 ; i < 5; ++ i)
    {
        m.push_back(i);
        std::cout << m[i] << std::endl;
    }
    std::cout << "\n" << m.getSize() << "\n";
    m.pop_back();
    m.resize(10);
    std::cout << m.getSize();
    std::cout << "Result of copy constructor\n";
    int_array i = m;
    for (int j = 0; j < m.getSize(); ++j)
    std::cout << i[j] << "\n";
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.02.2014, 17:12     Копирующий конструктор #8
Цитата Сообщение от Тамика Посмотреть сообщение
Вот эта.
Вот этот конструктор копирования:
C++
1
2
3
4
5
6
7
8
int_array(const int_array& in)
    {
        size = in.size;
        capacity = in.capacity;
        mas = new int[capacity];
        for (int i = 0; i < size; ++i)
            mas[i] = in.mas[i];
    }
не приводит к утечке памяти. Ещё вопросы?
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
14.02.2014, 17:16  [ТС]     Копирующий конструктор #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Вот этот конструктор копирования:
Почему тогда в коде выкидывает ошибку?
З.Ы. Вас не заставляют отвечать. А в коде ошибка. И я просто хочу узнать почему.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.02.2014, 17:20     Копирующий конструктор #10
Потому что вот здесь:
C++
1
2
std::cout << "Result of copy constructor\n";
int_array i = m;
работает не копирующий конструктор, а оператор присваивания (заданный по умолчанию). Ещё вопросы?
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
14.02.2014, 17:21  [ТС]     Копирующий конструктор #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Потому что вот здесь:
C++
1
2
std::cout << "Result of copy constructor\n";
int_array i = m;
работает не копирующий конструктор, а оператор присваивания (заданный по умолчанию). Ещё вопросы?
Есчё есть.
Это я увидела и изменила на int_array i(m);
Ситуация не изменилась.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.02.2014, 17:23     Копирующий конструктор #12
Цитата Сообщение от Тамика Посмотреть сообщение
Ситуация не изменилась.
Кака така ситуация?
raccoonlove
Заблокирован
14.02.2014, 17:24     Копирующий конструктор #13
Тамика, почитайте тут.
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
14.02.2014, 17:24  [ТС]     Копирующий конструктор #14
Цитата Сообщение от alsav22 Посмотреть сообщение
Кака така ситуация?
Ошибка в виде BLOCK_TYPE_IS_INVALID. Выводит мусор...
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.02.2014, 17:28     Копирующий конструктор #15
А если закоментировать?
C++
1
 m.resize(10);
Может теперь дело не в копирующем конструкторе, а в кривом коде?
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,537
Записей в блоге: 27
14.02.2014, 17:56  [ТС]     Копирующий конструктор #16
Цитата Сообщение от alsav22 Посмотреть сообщение
А если закоментировать?
C++
1
 m.resize(10);
Может теперь дело не в копирующем конструкторе, а в кривом коде?
Может.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.02.2014, 18:20     Копирующий конструктор #17
C++
1
2
3
4
5
6
7
8
9
void resize(int n)
    {
        int *temp = new int[n];
        capacity = n;
        for (int i = 0; i < size; ++i)
            temp[i] = mas[i];
        delete [] mas;
        mas = temp;
    }
Добавлено через 18 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
Потому что вот здесь:
C++
1
2
std::cout << "Result of copy constructor\n";
int_array i = m;
работает не копирующий конструктор, а оператор присваивания
Тут соврал, работает здесь копирующий конструктор.
C++
1
2
3
4
5
6
7
8
9
10
11
12
int_array& operator=(const int_array& in)
    {
        if (&in == this)
            return *this;
        delete [] mas;
        size = in.size;
        capacity = in.capacity;
        mas = new int[capacity];
        for (int i = 0; i < size; ++i)
            mas[i] = in.mas[i];
        return *this;
    }
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
14.02.2014, 19:26     Копирующий конструктор #18
Цитата Сообщение от Тамика Посмотреть сообщение
Добрый вечер всем!
Следущая проблема - решила создать свой персональный vector - int_array.
А можно поинтересоваться, для чего писать персональный вектор?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
14.02.2014, 20:24     Копирующий конструктор #19
Цитата Сообщение от DrOffset Посмотреть сообщение
А можно поинтересоваться, для чего писать персональный вектор?
If you understand int and vector, you understand C++. The rest is "details" (1300+ pages of details). (Bjarne Stroustrup)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2014, 20:35     Копирующий конструктор
Еще ссылки по теме:

C++ Копирующий конструктор абстрактного класа
закрытый копирующий конструктор C++
C++ Когда в классе нужен копирующий конструктор?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
14.02.2014, 20:35     Копирующий конструктор #20
Цитата Сообщение от 0x10 Посмотреть сообщение
If you understand int and vector, you understand C++. The rest is "details" (1300+ pages of details). (Bjarne Stroustrup)
Это прекрасно.
Только я не за этим спрашивал. Если человек пишет вектор для использования в проекте на работе, то во-первых стоит посмотреть на существующие реализации (помимо std::vector). А во-вторых, если таковой не найдется, то мы все, и я, могли бы подсказать, как ее лучше написать.
То, что было продемонстрировано ТС годится только в качестве упражнения для обучения.
Чтобы выяснить истинную задачу (обучение для себя или решение вопроса на работе), и я и задал этот вопрос.
Yandex
Объявления
14.02.2014, 20:35     Копирующий конструктор
Ответ Создать тему
Опции темы

Текущее время: 00:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru