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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Foxa
 Аватар для Foxa
0 / 0 / 0
Регистрация: 24.05.2010
Сообщений: 27
#1

Очередное деструктивное: при вызове деструктора все падает - C++

27.11.2014, 10:27. Просмотров 269. Ответов 18
Метки нет (Все метки)

Доброго времени суток! Есть некий класс H, с конструктором, деструктором:

C++
1
2
3
4
5
6
7
H(int size, int top){
this->size = size;
this->top = top;
this->set = new int[size];
}
 
~H(){ delete[] this->set; }
Объект создается, все хорошо, но при выходе из main, т.е. при вызове деструктора все падает на удалении массива. Не пойму,почему, ведь создан new[], значит и удалять delete[].
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
27.11.2014, 10:29     Очередное деструктивное: при вызове деструктора все падает #2
Foxa, Нужно больше кода.
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
27.11.2014, 10:34     Очередное деструктивное: при вызове деструктора все падает #3
C++
1
~H(){ delete[] (this->set;) }
а так?

Добавлено через 25 секунд
и покажите создание объекта в мейне)
CheshireCat
Эксперт С++
2910 / 1238 / 78
Регистрация: 27.05.2008
Сообщений: 3,321
27.11.2014, 10:37     Очередное деструктивное: при вызове деструктора все падает #4
Foxa, приведи код конструктора копирования и оператора=.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
27.11.2014, 10:37     Очередное деструктивное: при вызове деструктора все падает #5
Вцелом я почти уверен, что в коде не соблюдено "Правило трех" и создается копия этого объекта на стеке.
aLarman
27.11.2014, 10:37
  #6

Не по теме:

ForEveR, кстати да

taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.11.2014, 10:39     Очередное деструктивное: при вызове деструктора все падает #7
Foxa, теговать Билл будет?
demmax2004
58 / 136 / 35
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
27.11.2014, 10:58     Очередное деструктивное: при вызове деструктора все падает #8
Ты уверен что у тебя вызывается конструктор с параметрами H(int size, int top) ?
Foxa
 Аватар для Foxa
0 / 0 / 0
Регистрация: 24.05.2010
Сообщений: 27
27.11.2014, 17:22  [ТС]     Очередное деструктивное: при вызове деструктора все падает #9
C++
1
2
3
4
5
6
int main(){
    Fun arr(3);
    H test(3, 1);
    arr.add(test);
    return 0;
}
Fun еще один класс, используется как хранилище нескольких объектов H
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
27.11.2014, 17:24     Очередное деструктивное: при вызове деструктора все падает #10
Foxa, Показывайте весь класс H.
Foxa
 Аватар для Foxa
0 / 0 / 0
Регистрация: 24.05.2010
Сообщений: 27
27.11.2014, 17:25  [ТС]     Очередное деструктивное: при вызове деструктора все падает #11
Вот, все и сразу:
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
class H{
    int size;
    int top;
    int * set;
public:
    H(int size, int top){
        this->size = size;
        this->top = top;
        this->set = new int[size];
    }
 
    H(int size, int top, int * list){
        this->size = size;
        this->top = top;
        this->set = new int[size];
        for (int i = 0; i < this->size; i++)
            this->set[i] = list[i];
    }
 
    ~H(){ delete[] (this->set); }
 
    bool contain(int m){
        for (int i = 0; i < this->size; i++){
            if (m == this->set[i])
                return true;
        }
        return false;
    }
 
    int getTop(){ return this->top; }
    int getSet(int i){ return this->set[i]; }
};
 
class Fun{
    int counter;
    int dim;
    vector<H> list;
public:
    Fun(int dim){
        this->counter = 0;
        this->dim = dim;
    }
 
    void add(H & elem){
        this->counter++;
        (this->list).push_back(elem);
    }
 
    int getSize(){ return this->counter; }
 
    H getElem(int i){ return this->list[i]; }
};
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
27.11.2014, 17:36     Очередное деструктивное: при вызове деструктора все падает #12
C++
1
2
3
4
void add(H & elem){
        this->counter++;
        (this->list).push_back(elem);
    }
тут копирование,а в классе H нет конструктора копии

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
H(const H & h){
        this->size = h.size;
        this->top = h.top;
        this->set = new int[size];
        for(int i = 0; i < size; i++)
        {
              set[i] = h.set[i];
        }
    }
Foxa
 Аватар для Foxa
0 / 0 / 0
Регистрация: 24.05.2010
Сообщений: 27
27.11.2014, 17:39  [ТС]     Очередное деструктивное: при вызове деструктора все падает #13
Мне не нужно копирование. В функцию я подаю объект по ссылке, т.е. и в вектор должен добавляться сам объект. Нет?
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
27.11.2014, 17:48     Очередное деструктивное: при вызове деструктора все падает #14
Цитата Сообщение от Foxa Посмотреть сообщение
т.е. и в вектор должен добавляться сам объект. Нет?
тогда должен быть вектор ссылок, еще можно указателей попробовать, лучше просто определите конструктор копии, и будет счастье

Добавлено через 28 секунд
Цитата Сообщение от Foxa Посмотреть сообщение
Мне не нужно копирование.
Цитата Сообщение от Foxa Посмотреть сообщение
C++
1
H getElem(int i){ return this->list[i]; }
тут вот тоже копирование

Добавлено через 2 минуты
и это, this->list[i] Не обязательно, можно просто list[i]
Foxa
 Аватар для Foxa
0 / 0 / 0
Регистрация: 24.05.2010
Сообщений: 27
27.11.2014, 17:53  [ТС]     Очередное деструктивное: при вызове деструктора все падает #15
C++
1
2
3
4
5
6
7
H(const H & h){
        this->size = h.size;
        this->top = h.top;
        this->set = new int[size];
        for (int i = 0; i < size; i++)
            this->set[i] = h.getSet(i);
    }
Спасибо. Но в предпоследний строчке при вызове getSet(i) ругается на "cannot convert 'this' pointer from 'const H' to 'H &'
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.11.2014, 18:01     Очередное деструктивное: при вызове деструктора все падает #16
Цитата Сообщение от Foxa Посмотреть сообщение
Мне не нужно копирование. В функцию я подаю объект по ссылке, т.е. и в вектор должен добавляться сам объект. Нет?
Сам объект? Что серьёзно? Интересно, с какого перепугу он переместится то?
Foxa
 Аватар для Foxa
0 / 0 / 0
Регистрация: 24.05.2010
Сообщений: 27
27.11.2014, 18:13  [ТС]     Очередное деструктивное: при вызове деструктора все падает #17
Сам объект? Что серьёзно? Интересно, с какого перепугу он переместится то?
Уже, спасибо вышеотписавшимся, осознал ошибку, извините.

Добавлено через 10 минут
Проблема решилась не очень честно, у Н поле set стало public и обращение идет напрямую по индексу, но лучше не придумалось. Спасибо всем.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
27.11.2014, 19:37     Очередное деструктивное: при вызове деструктора все падает #18
Foxa, getSet должен быть константной функцией и все сразу будет работать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2014, 09:51     Очередное деструктивное: при вызове деструктора все падает
Еще ссылки по теме:

Программа выдаёт ошибку при вызове деструктора C++
C++ Ошибка при вызове деструктора
C++ При вызове деструктора вылазит ошибка _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
C++ При вызове деструктора выдается ошибка _BLOCK_TYPE_IS_VALID (pHead->nBlockUse)
Ошибка при вызове деструктора C++

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

Или воспользуйтесь поиском по форуму:
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.11.2014, 09:51     Очередное деструктивное: при вызове деструктора все падает #19
[quote="Foxa;6909321"]у Н поле set стало public и обращение идет напрямую по индексу, но лучше не придумалось. зачем его public то, мы же из самого класса к своему же полю обращаемся
Yandex
Объявления
28.11.2014, 09:51     Очередное деструктивное: при вызове деструктора все падает
Ответ Создать тему
Опции темы

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