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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 5.00
zydrate
0 / 0 / 0
Регистрация: 04.12.2010
Сообщений: 11
#1

Не работает деструктор - C++

24.03.2011, 19:53. Просмотров 1801. Ответов 3
Метки нет (Все метки)

Прошу помощи.Делаю лабораторную. Написал программу для подсчета суммы элементов в тех строках динамического массива, которые содержат хотя бы один отрицательный элемент. Все работает, но есть проблема. При попытке выйти из программы появляется ошибка:
"Необработанное исключение в "0x5fa959da (msvcr100d.dll)" в "Chapter2.exe": 0xC0000005: Нарушение прав доступа при чтении "0xcdcdcdc1".
При удалении из программы деструктора ошибка не появляется.
Я так понимаю деструктор почему-то не может очистить память при выходе из программы?
Вот код:
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <iostream>
using namespace std;
#include <conio.h>
#include <ctime>
 
class Array                                 //создаем класс Х
   {
  private:     
      int **x;                            // данные класса
      int m,n;
      
   public:                   
       Array (int,int);                 //метод конструктор
       ~Array ();                       //метод деструктор
      void Set (int,int);               // метод для задания значений массива
      friend void Run(Array&);              //функция друг; решает поставленную задачу
      void Print(void);              //метод просмотра нового текущего значения 
     
   };
///////////////////////////////////////////////////////////////////////
 Array::Array(int x1,int y1): m(x1), n(y1)  //определение конструктора
 {                            
    x = new  int*[m];           //выделяем память под переменные
    for(int i=1;i<=m;i++)
    x[i]= new int[n];
    //srand(time(NULL));
    for (int i=1; i<=m; i++)
    for (int j=1; j<=n; j++)
    *(*(x+i)+j)=rand()%10-4;//создаем массив случайных чисел, применение косвенной адресации
 }
 
 
 Array::~Array ()                                //определение деконструктора
      {
 
        for (int i=0; i<m; i++)     // Освобождение памяти
    {
        delete [ ] x[i];
        }
delete []x;
//x=NULL;
        }
 
void Array::Set(int x2,int y2)               //меняем значения элементов массива
{
     m=x2, n=y2;
     x = new  int*[m];      //выделяем память под переменные
    for(int i=1;i<=m;i++)
    x[i]= new int[n];
     cout<<"\nВведите элементы массива  ";
     for(int i=1;i<=m;i++)
    {
        cout<<endl;
        for (int j=1; j<=n; j++)
        {
        cout<<"\tx["<<i<<"]["<<j<<"]=";
        cin>>x[i][j];
        }
    }
}
void Run(Array&a)         //функция друг; решает поставленную задачу
{
    int summ=0;
    int su=0;
    cout<<endl;
    for (int i=1;i<=a.m;i++)
    {
        for(int j=1;j<=a.n;j++)
        {
            if ((a.x[i][j])<0)
            {
              for(j=1;j<=a.n;j++)             
                summ+=a.x[i][j];//находим сумму элементов в каждой нужной строке
                cout<<endl<<"Сумма элементов в "<<i<<" строке="<<summ;
                su+=summ;                   //общая сумма элементов
                summ=0;
            }
        }
    }
cout<<"\n\nОбщая сумма элементов "<<su;
}
 
void Array::Print(void)                                     //просмотр текущего значения массива    
{    
         cout<<"\nТекущие значения элементов массива:\n";
         for(int i=1;i<=m;i++)
      {
        cout<<endl;
        for (int j=1; j<=n; j++)
        cout<<"\tx["<<i<<"]["<<j<<"]="<<x[i][j];      
      }
}
 
/////////////////////////////////////////////////////////////////////////
 
 int main()
   {
   setlocale(LC_ALL, "Russian");
   char ch = 'y';
   int new_x=3, new_y=3;
   Array count1(new_x, new_y);      //создаем объект с помощью конструктора   
   Array *point;;                                        //объявляем указатель
   point=&count1;            //устанавливаем указатель  на объект
   count1.Print();
   
   Run(count1);
   
   cout<<"\n\nПродолжить? (y/n)...";
   cin>>ch;
        if (ch!='y'&&ch!='n')       
        {
         cout<<"Ошибка! Повторите ввод.";
         getch();
        }
   while (ch=='y')
   {
    cout<<"////////////////////////////////////////////////\n";
    cout<<"\nВведите количество строк массива  ";
    cin>>new_x;
    cout<<"\nВведите количество столбцов массива  ";
    cin>>new_y;
    point->Set(new_x, new_y);
    point->Print();
    Run(count1);
    cout<<"\n\nПродолжить? (y/n)";
    cin>>ch;
        if (ch!='y'&&ch!='n')                    
       {
        cout<<"Ошибка! Повторите ввод.";
        getch();
       }
   }
   return 0;
 }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2011, 19:53     Не работает деструктор
Посмотрите здесь:

Не работает деструктор C++ - C++
Работаю в среде DEVc++ #include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; class Employee { ...

Не работает деструктор - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using std::cout; #pragma hdrstop #pragma argsused class vect { public: vect(int...

Не работает деструктор - C++
Выписал пример из самоучителя, но выяснилось что не работает деструктор. В чем проблема? #include &lt;iostream&gt; using namespace std; ...

не работает деструктор - C++
это моя первая программа..я еще не особо разобралась..обьясните почему не работает деструктор и как исправить ошибки #include...

Почему деструктор не работает? - C++
Вроде написал все правильно, а почему то деструктор не работает, данные HI не выводит, почему ? #include &lt;iostream&gt; using namespace...

Почему не работает деструктор? - C++
Собственно говоря, почему? #include &lt;iostream&gt; using namespace std; class Osoba{ public : char* imie; int wiek; ...

Как работает деструктор? - C++
1.Деструктор вызывается когда объект удаляется? ИЛИ 2. Сам деструктор удаляет объект? P.s. Надеюсь понятно))

Не работает деструктор и операторы - C++
Задача, на создание класса «вектор в n-мерном пространстве». Я первоначально сделал эту задачу с статическим выделением памяти, но сказали,...

Почему не работает деструктор? - C++
Подскажите пожалуйста, почему у меня не работает деструктор? #include &lt;iostream.h&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt; ...

Почему деструктор работает неправильно? - C++
на лабараторной столкнулся в проблемой. деструктор вызывается только один раз. #include &lt;cstring&gt; #include &lt;iostream&gt; using...

почему деструктор работает вначале? - C++
#pragma once class Student { private: char* name; int course; public: Student(void); ~Student(void); ...

ООП. Не работает задача (конструктор, деструктор) - C++
Ребят, есть задача, она решенная, но я не могу разобраться в работе конструктора и деструктора, поэтому файлы, приложенные к условию не...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
24.03.2011, 20:40     Не работает деструктор #2
zydrate, ошибка в конструкторе:
C++
1
2
3
4
5
6
7
8
9
10
Array::Array(int x1,int y1): m(x1), n(y1)  //определение конструктора
 {                            
        x = new  int*[m];                       //выделяем память под переменные
        for(int i=0;i<m;i++)
        x[i]= new int[n];
        //srand(time(NULL));
        for (int i=0; i<m; i++)
        for (int j=0; j<n; j++)
        *(*(x+i)+j)=rand()%10-4;//создаем массив случайных чисел, применение косвенной адресации
 }
так попробуй...

и еще та же проблема в функциях - неправильная индексация массива.
zydrate
0 / 0 / 0
Регистрация: 04.12.2010
Сообщений: 11
24.03.2011, 20:49  [ТС]     Не работает деструктор #3
Kastaneda, благодарю за помощь. И правда, ошибка исчезла!
Я правда так и не понял почему.
Получается, запись for (int i=0; i<m; i++) и for (int i=1; i<=m; i++) не всегда будут иметь один и тот же смысл? Всегда думал иначе
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
24.03.2011, 21:01     Не работает деструктор #4
индексация массива начинается с нуля и заканчивается n-1. Например:
C++
1
int mas[10];
такой массив имеет интервал от mas[0] до mas[9].
Yandex
Объявления
24.03.2011, 21:01     Не работает деструктор
Ответ Создать тему
Опции темы

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