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

Вылет при срабатывании деструктора - C++

Восстановить пароль Регистрация
 
_Колючий_
3 / 3 / 2
Регистрация: 05.08.2012
Сообщений: 88
26.08.2013, 17:09     Вылет при срабатывании деструктора #1
Собственно говоря вот:
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
class MatrixGraph   
{
int **arcs;
int n;
 
public:
 
MatrixGraph(int vertexnumber)      //конструктор графа
{
n=vertexnumber;
arcs=new int*[vertexnumber];
for(int i=0; i<vertexnumber; i++)
arcs[i]=new int[i];
for (int i=0; i<vertexnumber; i++)
    for(int j=0; j<vertexnumber; j++)
        arcs[i][j]=0;
}
 
~MatrixGraph()
{
for (int i=0; i<n; i++)
    delete []arcs[i];
delete []arcs;
}
 
};
При срабатывании деструктора происходит вылет
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.08.2013, 17:09     Вылет при срабатывании деструктора
Посмотрите здесь:

C++ Ошибка при вызове деструктора
C++ Проблемы при вызове деструктора
C++ ошибка при вызове деструктора!
C++ Ошибка при вызове деструктора
C++ Ошибка сегментации при срабатывании деструктора
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soican
49 / 23 / 1
Регистрация: 16.11.2011
Сообщений: 329
Записей в блоге: 5
26.08.2013, 17:19     Вылет при срабатывании деструктора #2
у меня было такое)) в том случае если MatrixGraph(int vertexnumber) не применялось, т.е. память не выделялась, а потом пыталась удалится, я делал так в конце MatrixGraph(int vertexnumber) ставил
C++
1
bool a = true;
а деструктор
C++
1
if (a){...}
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
26.08.2013, 17:24     Вылет при срабатывании деструктора #3
В этом куске выход за пределы выделенной памяти.
Цитата Сообщение от _Колючий_ Посмотреть сообщение
for (int i=0; i<vertexnumber; i++)
* * for(int j=0; j<vertexnumber; j++)
* * * * arcs[i][j]=0;
Ранее вы выделили под i-тую строку i символов.
Цитата Сообщение от _Колючий_ Посмотреть сообщение
for(int i=0; i<vertexnumber; i++)
arcs[i]=new int[i];
_Колючий_
3 / 3 / 2
Регистрация: 05.08.2012
Сообщений: 88
26.08.2013, 17:36  [ТС]     Вылет при срабатывании деструктора #4
По-идее, выделяется память...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void GraphMatrixtMenu()
{
system("cls");
char choice='0'; int from, to, weigth; std::cout<<"Это меню для тестирования графа."<<endl<<"Введите число вершин: "; 
cin>>to; MatrixGraph gr(to); 
cout<<endl; gr.showMatrix(); cout<<endl; system("pause");
while (choice!='1')
{system("cls");
cout<<"Это меню для тестирования графа."<<endl<<"Нажмите 1 для выхода"
<< endl<<"2 для добавления ребра"<<endl<<"3 для обхода вглубину"<<endl
<< "Номер операции: ";
choice=_getche();
switch(choice)
{
case '2':  system("cls"); cout<<endl<<"Откуда :"; cin>>from; cout<<endl<<"Куда: "; cin>>to; 
           cout<<endl<<"Вес ребра: "; cin>>weigth; gr.addArc(from, to, weigth);
           cout<<endl<<"Ребро добавлено!"<<endl; cout<<endl; gr.showMatrix(); cout<<endl; system("pause"); break;
case '3':  system("cls"); gr.passInDepth(); break;
 
}
system("cls");
}
}
Добавлено через 10 минут
Сделал так

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
class MatrixGraph   
{
int **arcs;
int n;
 
public:
 
MatrixGraph(int vertexnumber)      //конструктор графа
{
n=vertexnumber;
arcs=new int*[vertexnumber];
for(int i=0; i<vertexnumber; i++)
arcs[i]=new int[vertexnumber];
for (int i=0; i<vertexnumber; i++)
    for(int j=0; j<vertexnumber; j++)
        arcs[i][j]=0;
 
}
 
~MatrixGraph()
{
    
for (int i=0; i<n; i++)
    delete []arcs[n];
delete []arcs;
    }
 
};
Все равно вылетает . Если закоментить деструктор, то вылеты пропадают.
Убежденный
Системный программист
 Аватар для Убежденный
14190 / 6205 / 984
Регистрация: 02.05.2013
Сообщений: 10,338
Завершенные тесты: 1
26.08.2013, 17:39     Вылет при срабатывании деструктора #5
arcs=new int*[vertexnumber];
Создали массив указателей на int.

for(int i=0; i<vertexnumber; i++)
arcs[i]=new int[i];
Заполнили каждый элемент массива указателем на массив int.

for (int i=0; i<vertexnumber; i++)
for(int j=0; j<vertexnumber; j++)
arcs[i][j]=0;
}
Теперь все перезаписали нулями по новой.

for (int i=0; i<n; i++)
delete []arcs[i];
delete []arcs;
arcs[i] указывает теперь на NULL.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
26.08.2013, 17:42     Вылет при срабатывании деструктора #6
Возможно, вы освобождаете память где-то еще или изменяете значение переменной, хранящей размер. Покажите весь код MatrixGraph.
_Колючий_
3 / 3 / 2
Регистрация: 05.08.2012
Сообщений: 88
26.08.2013, 17:49  [ТС]     Вылет при срабатывании деструктора #7
Вот полный код

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
class MatrixGraph   
{
int **arcs; //матрица смежности
int n;      //количество вершин
 
bool noAvailible(stek<int> &existed,int current)    // нет доступных вершин
{
for (int j=0; j<n; j++) 
    if (arcs[current][j]!=0 && !existed.find(arcs[current][j])) return false;
return true;
}
 
int firstAvailible(stek<int> &existed,int current)  // одна из непройденных доступных вершин
{
    for (int j=0; j<n; j++) if (arcs[current][j]!=0 && existed.find(arcs[current][j])==false) return j;
}
 
public:
 
MatrixGraph(int vertexnumber)      //конструктор графа
{
n=vertexnumber;
arcs=new int*[vertexnumber];
for(int i=0; i<vertexnumber; i++)
arcs[i]=new int[vertexnumber];
for (int i=0; i<vertexnumber; i++)
    for(int j=0; j<vertexnumber; j++)
        arcs[i][j]=0;
 
}
 
//добавление ребра
void addArc(int from, int to, int weigth=1)
{
arcs[from][to]=weigth;
}   
//Существование ребра
bool hasArc(int from, int to)
{
return arcs[from][to];
}
 
void showMatrix()             // Контроль содержимого матрицы
{
for (int i=0; i<n; i++)
    {for(int j=0; j<n; j++)
    cout<<arcs[i][j]<<' ';
cout<<endl;}
}
 
void passInDepth(int current=0)          // Обход в глубину (не работает)
{
stek<int> backput; 
stek<int> existed; existed.add(current);
cout<<endl<<"Посещен узел № "<<current;
 
while (true)
{
    if (backput.isEmpty() && noAvailible(existed, current)) {cout<<endl<<"Все узлы посещены!"; system("pause"); return;}
    if (noAvailible(existed, current)) {current=backput.popTop(); continue;}
backput.add(current); current=firstAvailible(existed, current); existed.add(current); cout<<endl<<"Посещен узел № "<<current;
}
}
 
~MatrixGraph()                   // деструктор
{
    
for (int i=0; i<n; i++)
    delete []arcs[n];
delete []arcs;
    }
 
};
Добавлено через 40 секунд
Еще применяется стек

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
template<class S>
class stek                //описание стека
{protected:
    struct Item
    {
        S data;
        Item *next;
    };
Item *top;
 
public: 
    
stek(): top(NULL){}    //конструктор стека
 
bool isEmpty() const //Проверка стека на пустоту
{return (top==NULL);}
 
void add(S data)         //добавление эллемента в стек
{Item *temp=new Item;
temp->data=data;
temp->next=top;
top=temp;}
 
void show() const             //Просмотр стека (в случае, если можно вывести на экран)
{
Item *current=top;
while(current)
{
cout<<' '<<current->data;
current=current->next;
}
cout<<endl;
}
 
bool find (S data) const
{
Item *current=top;
while(current)
{
if (data==current->data)
    return true;
current=current->next;
}
return false;
}
 
S first() const              // Получение данных с вершины
{
    return top->data;}
 
void pop()           // удаление вершины
{Item *temp;
if (top)
{temp=top;
top=top->next;
delete temp;}
}
 
S popTop()             // удаление вершины с получением информации
{Item *temp; S data; 
temp=top; data=top->data;
top=top->next;
delete temp;
return data;
}
 
~stek()                //деструктор стека
{
Item *temp=top;
while (top)
{   temp=top;
    top=top->next;
    delete temp;
}
 
}
 
 
};
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,208
Записей в блоге: 11
26.08.2013, 17:55     Вылет при срабатывании деструктора #8
Все правильно, при повторном вызове delete программа должна падать.
C++
1
2
3
4
5
6
7
8
~MatrixGraph()
{
    
for (int i=0; i<n; i++)
    delete []arcs[n];
delete []arcs;
    }
 };
исправь опечатку
Убежденный
Системный программист
 Аватар для Убежденный
14190 / 6205 / 984
Регистрация: 02.05.2013
Сообщений: 10,338
Завершенные тесты: 1
26.08.2013, 17:57     Вылет при срабатывании деструктора #9
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
delete []arcs[n];
Попробуйте так: delete [] arcs [i];
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2013, 17:58     Вылет при срабатывании деструктора
Еще ссылки по теме:

Ошибка при вызове деструктора C++
Ошибка при работе деструктора C++
C++ Выход из цикла при срабатывании исключения

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

Или воспользуйтесь поиском по форуму:
_Колючий_
3 / 3 / 2
Регистрация: 05.08.2012
Сообщений: 88
26.08.2013, 17:58  [ТС]     Вылет при срабатывании деструктора #10
Понял, что за проблема. Спасибо большое за помощь
Yandex
Объявления
26.08.2013, 17:58     Вылет при срабатывании деструктора
Ответ Создать тему
Опции темы

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