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

Проблемы с памятью - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Какой код у символа ` http://www.cyberforum.ru/cpp-beginners/thread838173.html
Который без шифта на копке с тильдой и буквой ё.
C++ Сортировка С++ Дано N натуральных чисел. Требуется найти минимальное натуральное число, не представимое суммой никаких из этих чисел, если в эту сумму каждое исходное число может входить не более одного раза. Входные данные Входной файл INPUT.TXT в первой строке содержит натуральное число N, не превосходящее 10^4, далее следуют N строк, в каждой из которых записано по одному натуральному числу,... http://www.cyberforum.ru/cpp-beginners/thread838149.html
C++ Вычислить выражение
Здравствуйте! Как в C++ записать вот такое выражение:
C++ Массив: Верно ли, что для каждой точки А существует точка B (A≠B) такая, что не существует двух точек множества M, лежащих по разные стороны от прямой
Задано множество M точек на плоскости. Определить, верно ли, что для каждой точки А принадлежит М существует точка B принадлежит M (A≠B) такая, что не существует двух точек множества M, лежащих по разные стороны от прямой Помогите решить не силен в языке...
C++ Обратные вызовы http://www.cyberforum.ru/cpp-beginners/thread838115.html
Здорова господа! Я от решаю задачку: Напишите класс или шаблон, подходящие для реализации обратных вызовов. Не сильно ясно, что такое обратный вызов? Задача из раздела обработка исключений. Добавлено через 45 минут Кро может простой примерчик обратного вызова привести?
C++ Перекодировка Нужна какая то функция, которая будет возвращать std::wstring в unicod, принимая на входе ansi с кириллицей и латиницей в char*, const char*, или в std::string, но не в std::&string, не в std::*string, не в const std::&string и не в const std::*string, на входе должна быть разрешена явная нуль-терминальная константа в ansi, или её приведение к std::string без создания специальной переменной в... подробнее

Показать сообщение отдельно
Wanee
53 / 53 / 13
Регистрация: 02.02.2011
Сообщений: 430

Проблемы с памятью - C++

15.04.2013, 09:55. Просмотров 443. Ответов 18
Метки (Все метки)

Программа создает династическую двумерную матрицу. Не могу найти где происходит утечка памяти. Если несколько раз вводить большие размеры матрицы, то не происходит полная очистка памяти и программа просто закрывается. Помогите найти утечку и очищать память корректно.

Often.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef _OFTEN_H_
#define _OFTEN_H_
 
bool Ioresult(std::istream &stream); //Функция проверки правильности ввода c клавиатуры;
bool Ioresult(std::ifstream &stream); //Функция проверки правильности ввода из файла;
 
void Сlean(long **&meas, long size_y, long size_x); //Функция очищает выделенную память под матрицу;
void Init(long **&meas, long size_y, long size_x); //Функция выделяет память для матрицы C размеными Size_y на Size_x;
long Sing(long **&meas, long size_y, long size_x); //Функция возвращает строку с максимальной суммой модулей элементов;
void Save(long **&meas, long size_y, long size_x, std::ofstream &stream, char *&name); //Функция сохранения матрицы в файл;
void Open(long **&meas, long &size_y, long &size_x, std::ifstream &stream, char *&name); //Функция для заполнения из файла;
 
#endif
Often.cpp
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <iostream> //istream;
#include <fstream> //ifstream, ofstream;
#include <stdlib.h> //abs(), system();
 
#include "Often.h"
 
bool Ioresult(std::ifstream &stream)
{   
    if(stream.fail())
    {
        stream.clear(); stream.sync();
        return true;
    }
    return false;
}
 
bool Ioresult(std::istream &stream)
{
    if(stream.rdbuf()->in_avail() != 1)
    {
        stream.clear(); stream.sync();
        return true;
    }
    stream.sync();
    return false;
}
 
void Сlean(long **&meas, long size_y, long size_x)
{
    if(!meas) throw 1; //Ошибка, память не выделена;
    if(size_y < 1 || size_x < 1) throw 3; //Ошибка, неправильные размеры;;
    for(long j = 0; j < size_y; j++) delete [] meas[j];
    delete [] meas;
    meas = 0;
}
 
void Init(long **&meas, long size_y, long size_x)
{
    if(meas) throw 2; //Ошибка, память уже выделена;
    if(size_y < 1 || size_x < 1) throw 3; //Ошибка, неправильные размеры;
    meas = new long*[size_y];
    for(long j = 0; j < size_y; j++) meas[j] = new long[size_x];
    for(long j = 0; j < size_y; j++)
        for(long i = 0; i < size_x; i++) meas[j][i] = 0;
}
 
long Sing(long **&meas, long size_y, long size_x)
{
    if(!meas) throw 1; //Ошибка, память не выделена;
    if(size_y < 1 || size_x < 1) throw 3; //Ошибка, неправильные размеры;
    for(long j = 0; j < size_y; j++) if(!meas[j]) throw 5; //Ошибка, память выделена не под всю матрицу;
    long Max = 0, Index = -1, Sum;
    bool Soot;
    for(int j = 0; j < size_y; j++)
    {
        Sum = 0;
        Soot = true;
        for(long i = 0; i < size_x; i++)
        {
            Sum = abs(meas[j][i]);
            if(!(meas[j][i] % 2)) Soot = false;
        }
        if(Soot && Max < Sum)
        {
            Max = Sum;
            Index = j;
        }
    }
    if(Index == -1) throw 6; //Ошибка, не найдено не одной строки удовлетворяющих требованиям;
    return Index;
}
 
void Save(long **&meas, long size_y, long size_x, std::ofstream &stream, char *&name)
{
    if(!meas) throw 1; //Ошибка, память не выделена;
    if(size_y < 1 || size_x < 1) throw 3; //Ошибка, неправильные размеры;
    for(long j = 0; j < size_y; j++) if(!meas[j]) throw 5; //Ошибка, память выделена не под всю матрицу;
    stream.open(name, std::ios_base::out);
    if (!stream.is_open()) throw 7; //Ошибка, не удалось открыть файл для записи;
    stream << size_y << ' ' << size_x << '\n';
    for(long j = 0; j < size_y; j++)
    {
        for(long i = 0; i < size_x; i++)
        {
            stream << meas[j][i];
            if(i < size_x - 1) stream << ' ';
        }
        if(j < size_y - 1) stream << '\n';
    }
    stream.close();
}
 
void Open(long **&meas, long &size_y, long &size_x, std::ifstream &stream, char *&name)
{
    if(meas) throw 2; //Ошибка, память уже выделена;
    stream.open(name, std::ios_base::in);
    if (!stream.is_open()) throw 8; //Ошибка, не удалось открыть файл для чтения;
    if(stream.eof())
    {
        stream.close();
        throw 9; //Ошибка, файл пуст;
    }
    stream >> size_y;
    if(Ioresult(stream))
    {
        stream.close();
        throw 10; //Ошибка, не удалось считать содерживое файла;
    }
    if(stream.eof())
    {
        stream.close();
        throw 11; //Ошибка, не хватает данных в файле;
    }
    stream >> size_x;
    if(Ioresult(stream))
    {
        stream.close();
        throw 10; //Ошибка, не удалось считать содерживое файла;
    }
    Init(meas, size_y, size_x);
    long j = 0, i = 0;
    while(!stream.eof() && j != size_y)
    {
        stream >> meas[j][i];
        if(Ioresult(stream))
        {
            Сlean(meas, size_y, size_x);
            stream.close();
            throw 10; //Ошибка, не удалось считать содерживое файла;
        }
        i++;
        if(i == size_x)
        {
            j++;
            i = 0;
        }
    }
    if(j != size_y)
    {
        Сlean(meas, size_y, size_x);
        stream.close();
        throw 11; //Ошибка, не хватает данных в файле;
    }
    if(stream.rdbuf()->in_avail())
    {
        Сlean(meas, size_y, size_x);
        stream.close();
        throw 12; //Ошибка, в файле содержаться лишний данные;
    }
    stream.close();
}
Main.cpp
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
#include <iostream> //istream;
#include <fstream> //ifstream, ofstream;
#include <stdlib.h> //abs(), system();
#include <conio.h> //getch();
#include <stdio.h> //gets();
#include <time.h> //time();
#include <new> //bad_alloc
 
#include "Often.h"
 
using namespace std;
 
void PrintR(int x)
{
    switch(x)
    {
    case 1:
        cout << "Ошибка, память не выделена. ";
        break;
    case 2:
        cout << "Ошибка, память уже выделена. ";
        break;
    case 3:
        cout << "Ошибка, неправильные размеры. ";
        break;
    case 5:
        cout << "Ошибка, память выделена не под всю матрицу. ";
        break;
    case 6:
        cout << "Ошибка, не найдено не одной строки удовлетворяющих требованиям. ";
        break;
    case 7:
        cout << "Ошибка, не удалось открыть файл для записи. ";
        break;
    case 8:
        cout << "Ошибка, не удалось открыть файл для чтения. ";
        break;
    case 9:
        cout << "Ошибка, файл пуст. ";
        break;
    case 10:
        cout << "Ошибка, не удалось считать содерживое файла. ";
        break;
    case 11:
        cout << "Ошибка, не хватает данных в файле. ";
        break;
    case 12:
        cout << "Ошибка, в файле содержаться лишний данные. ";
        break;
    default:
        cout << "Неизвестная ошибка. ";
    }
}
 
void main(int argc, char *argv[])
{
    srand(time(NULL)); //Для генераций случайных чисел
    setlocale(LC_ALL, "Russian");   
 
    long **meas = 0;
    long size_y, size_x;
    char *name = new char[261];
    ifstream in;
    ofstream out;
 
    if(argc == 2)
    {
        try
        {
            Open(meas, size_y, size_x, in, argv[1]);
            system("cls");
            cout << "Матрица успешно считана из файл. ";
            system("pause");
        }
        catch(int x)
        {
            system("cls");
            PrintR(x);
            system("pause");
        }
        catch(bad_alloc)
        {
            if(!meas) Сlean(meas, size_y, size_x);
            system("cls");
            cout << "Нехватило памяти. ";
            system("pause");
        }
    }
    
    bool ext = true;
    char ch;
    int item = 1;
 
    do{
        system("cls");
        switch(item){
        case 1:
            cout << "1.Создать.\n";
            cout << "2.Просмотреть.\n";
            cout << "3.Обработать.\n";
            cout << "4.Сохранить в файл.\n";
            cout << "5.Выход.\n";
            break;
        case 2:
            cout << "1.С клавиатуры.\n";
            cout << "2.Случайным образом.\n";
            cout << "3.Заполнить из файла.\n";
            cout << "4.Назад.\n";
            break;
        }
 
        ch = getch();
 
        try
        {
            switch(item)
            {
            case 1:
                switch(ch)
                {
                case '1':
                    item = 2;
                    break;
                case '2':
                    if(!meas) throw 1; //Ошибка, память не выделена;
                    if(size_y < 1 || size_x < 1) throw 3; //Ошибка, неправильные размеры;
                    for(long j = 0; j < size_y; j++) if(!meas[j]) throw 5; //Ошибка, память выделена не под всю матрицу;
                    system("cls");
                    cout << "Элементы матрица:\n";
                    for(long j = 0; j < size_y; j++)
                    {
                        for(long i = 0; i < size_x; i++)
                        {
                            cout << meas[j][i];
                            if(i < size_x - 1) cout << ' ';
                        }
                        if(j < size_y - 1) cout << '\n';
                    }
                    system("pause");
                    break;
                case '3':
                    if(!meas) throw 1; //Ошибка, память не выделена;
                    if(size_y < 1 || size_x < 1) throw 3; //Ошибка, неправильные размеры;
                    for(long j = 0; j < size_y; j++) if(!meas[j]) throw 5; //Ошибка, память выделена не под всю матрицу;
                    system("cls");
                    cout << "Номер строки: " << Sing(meas, size_y, size_x) << '\n';
                    system("pause");
                    break;
                case '4':
                    if(!meas) throw 1; //Ошибка, память не выделена;
                    if(size_y < 1 || size_x < 1) throw 3; //Ошибка, неправильные размеры;
                    for(long j = 0; j < size_y; j++) if(!meas[j]) throw 5; //Ошибка, память выделена не под всю матрицу;
                    system("cls");
                    cout << "Введите имя файла: ";
                    gets(name);
                    Save(meas, size_y, size_x, out, name);
                    system("cls");
                    cout << "Матрица успешно записана в файл. ";
                    system("pause");
                    break;
                case '5':
                    ext = false;
                    if(meas) Сlean(meas, size_y, size_x);
                    delete []name;
                    break;
                }
                break;
            case 2:
                switch(ch)
                {
                case '1':
                    if(meas) Сlean(meas, size_y, size_x);
                    do{
                        system("cls");
                        cout << "Введите количество строк матрицы: ";
                        cin >> size_y;
                    }while(Ioresult(cin));
                    do{
                        system("cls");
                        cout << "Введите количество столбцов матрицы: ";
                        cin >> size_x;
                    }while(Ioresult(cin));
                    Init(meas, size_y, size_x);
                    for(long j = 0; j < size_y; j++)
                        for(long i = 0; i < size_x; i++)
                            do{
                                system("cls");
                                cout << "Введите C[" << j << "][" << i << "]: ";
                                cin >> meas[j][i];
                            }while(Ioresult(cin));
                    system("cls");
                    cout << "Матрица успешно создана. ";
                    system("pause");
                    break;
                case '2':
                    if(meas) Сlean(meas, size_y, size_x);
                    do{
                        system("cls");
                        cout << "Введите количество строк матрицы: ";
                        cin >> size_y;
                    }while(Ioresult(cin));
                    do{
                        system("cls");
                        cout << "Введите количество столбцов матрицы: ";
                        cin >> size_x;
                    }while(Ioresult(cin));
                    Init(meas, size_y, size_x);
                    for(long j = 0; j < size_y; j++)
                        for(long i = 0; i < size_x; i++) meas[j][i] = rand();
                    system("cls");
                    cout << "Матрица успешно создана. ";
                    system("pause");
                    break;
                case '3':
                    if(meas) Сlean(meas, size_y, size_x);
                    system("cls");
                    cout << "Введите имя файла: ";
                    gets(name);
                    Open(meas, size_y, size_x, in, name);
                    system("cls");
                    cout << "Матрица успешно считана из файл. ";
                    system("pause");
                    break;
                case '4':
                    item = 1;
                    break;
                }
                break;
            }
 
        }
        catch(int x)
        {
            system("cls");
            PrintR(x);
            system("pause");
        }
        catch(bad_alloc)
        {
            if(!meas) Сlean(meas, size_y, size_x);
            system("cls");
            cout << "Нехватило памяти. ";
            system("pause");
        }
    }while(ext);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru