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

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

Восстановить пароль Регистрация
 
Foxa
 Аватар для Foxa
0 / 0 / 0
Регистрация: 24.05.2010
Сообщений: 27
27.11.2014, 10:27     Очередное деструктивное: при вызове деструктора все падает #1
Доброго времени суток! Есть некий класс 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[].
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2014, 10:27     Очередное деструктивное: при вызове деструктора все падает
Посмотрите здесь:

C++ Ошибка при вызове деструктора
C++ Проблемы при вызове деструктора
C++ ошибка при вызове деструктора!
C++ Ошибка при вызове деструктора
C++ Heap corruption при вызове деструктора для char*
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.11.2014, 10:29     Очередное деструктивное: при вызове деструктора все падает #2
Foxa, Нужно больше кода.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
27.11.2014, 10:34     Очередное деструктивное: при вызове деструктора все падает #3
C++
1
~H(){ delete[] (this->set;) }
а так?

Добавлено через 25 секунд
и покажите создание объекта в мейне)
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
27.11.2014, 10:37     Очередное деструктивное: при вызове деструктора все падает #4
Foxa, приведи код конструктора копирования и оператора=.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
57 / 135 / 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
636 / 557 / 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
636 / 557 / 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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++ Ошибка при вызове деструктора

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

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

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