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

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

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

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

27.11.2014, 10:27. Просмотров 331. Ответов 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[].
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2014, 10:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Очередное деструктивное: при вызове деструктора все падает (C++):

Ошибка при вызове деструктора - C++
Добрый вечер! Почему при вызове деструктора вылетает ошибка после компиляции кода? #include <conio.h> #include <iostream> #include...

Ошибка при вызове деструктора - C++
Не могу дописать лабу... Надо создать 4 класса, описать поля и методы. Выкладываю исходники: Самый главный класс - Order. Выбивает ошибку в...

Ошибка при вызове деструктора - C++
По окончании программы выдает ошибку #include <string.h> #include <iostream> using namespace std; class nik //объявление...

Ошибка при вызове деструктора - C++
Подскажите, что не так с этим деструктором? Просто выдает ошибку. Если его убираю то все идет норм. Если же оставляю, то куча всяких...

Ошибка при вызове деструктора - C++
Программа компилиться нормально,но после выполнения system("pause"); выползает непонятное окно,и указывает на ошибку в деструкторе.В чем...

Проблемы при вызове деструктора - C++
В процессе работы программы указатель на класс Dictionary,который является членом класса DictionaryManager,должен указывать на разные...

18
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
27.11.2014, 10:29 #2
Foxa, Нужно больше кода.
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
27.11.2014, 10:34 #3
C++
1
~H(){ delete[] (this->set;) }
а так?

Добавлено через 25 секунд
и покажите создание объекта в мейне)
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
27.11.2014, 10:37 #4
Foxa, приведи код конструктора копирования и оператора=.
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
27.11.2014, 10:37 #5
Вцелом я почти уверен, что в коде не соблюдено "Правило трех" и создается копия этого объекта на стеке.
0
aLarman
27.11.2014, 10:37
  #6

Не по теме:

ForEveR, кстати да

0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.11.2014, 10:39 #7
Foxa, теговать Билл будет?
0
demmax2004
60 / 138 / 35
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
27.11.2014, 10:58 #8
Ты уверен что у тебя вызывается конструктор с параметрами H(int size, int top) ?
0
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
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
27.11.2014, 17:24 #10
Foxa, Показывайте весь класс H.
0
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]; }
};
0
aLarman
642 / 563 / 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];
        }
    }
1
Foxa
0 / 0 / 0
Регистрация: 24.05.2010
Сообщений: 27
27.11.2014, 17:39  [ТС] #13
Мне не нужно копирование. В функцию я подаю объект по ссылке, т.е. и в вектор должен добавляться сам объект. Нет?
0
aLarman
642 / 563 / 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]
1
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 &'
0
27.11.2014, 17:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2014, 17:53
Привет! Вот еще темы с ответами:

Ошибка при вызове деструктора - C++
Всем привет ! Есть класс class building { private: string *location_street; unsigned int *number_of_building; public...

_BLOCK_TYPE_IS_VALID при вызове деструктора класса - C++
при вызове деструктора моего класса вылетает ошибка _BLOCK_TYPE_IS_VALID(pHead-&gt;nBlockUse) конструкрор копирования создал и оператор =...

Программа выдаёт ошибку при вызове деструктора - C++
Здравствуйте! Есть два шаблона: 1) шаблон двухсвязного списка 2) шаблон файла, для записи двусвязного списка в файл, и для чтения...

Heap corruption при вызове деструктора для char* - C++
в классе есть переменная типа char*, в конструкторе ей выделяется память и записывается значение, в деструкторе пытаюсь ее удалить и...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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