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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Составить описание объектного типа Matrix http://www.cyberforum.ru/cpp-beginners/thread891556.html
Составить описание объектного типа Matrix, обеспечивающего инициализации единичной матрицы, квадратных матриц, сложение матриц, транспонирование, вычисление определителя матрицы.
C++ Даны действительные u, v, натуральное п алгоритм решения каждой задачи реализовать всеми типами цик-лических операторов (если это возможно): do, for, while) БЕЗ ИСПОЛЬЗОВАНИЯ МАССИВОВ Сама задачка в фото внизу http://s3.uploads.ru/UOn00.jpg Спасибо большое. http://www.cyberforum.ru/cpp-beginners/thread891553.html
C++ Библиотека времени выполнения (компиляция /MT)
такая проблема: компилирую /MDd все отлично, но прога не запустится на других компах. компилирую /MD, не запустится на других компах + ошибки: main.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp___CrtDbgReportW в функции "public: void __thiscall std::_String_const_iterator<char,struct std::char_traits<char>,class std::allocator<char> >::_Compat(class...
Цикл: Вычислить выражение по заданной формуле C++
Алгоритм решения каждой задачи реализовать всеми типами циклических операторов (если это возможно): do, for, while) БЕЗ ИСПОЛЬЗОВАНИЯ МАССИВОВ 1.Дано натуральное число п. Вычислить: Спасибо большое.
C++ Разработать алгоритм и написать по нему программу умножения матрицы А размера m × n на матрицу В размера n × p. Значение величин m, n, р выбрать из та http://www.cyberforum.ru/cpp-beginners/thread891550.html
Разработать алгоритм и написать по нему программу умножения матрицы А размера m × n на матрицу В размера n × p. Значение величин m, n, р выбрать из табл. 4.2 в соответствии с вариантом задания. M = 3 N = 4 P = 6
C++ Чтение из файла и вывод на экран Помогите разобраться: 1)Чтение из файла Программа должна выводить на экран данные сохраненные ею же в формате .txt, у меня не получается не могли бы вы мне помочь с этим и... 2)Вывод на экран. Программа выводит данные введенные ранее это у меня работает, но не получается оформить эти данные. В программе я ввожу данные по квартирам: Введите количество комнат : 2 Введите этаж : 5 Введите... подробнее

Показать сообщение отдельно
Петр91
5 / 5 / 1
Регистрация: 17.05.2010
Сообщений: 108

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

05.06.2013, 02:38. Просмотров 910. Ответов 3
Метки (Все метки)

Здравствуйте, проблема такая. Написал программу итерационного метода. Далее эту программу, поместил в функцию. И вызываю очень часто (порядка 200 000 итераций). Функция содержит огромные массивы. Сначала ошибка была где то после 500 итераций, сейчас всю память почистил и где то через 5000 все равно ругается. Вопрос, может как то еще надо очищать память? Привожу код функции

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
long double *GMRES3(long double *q, int MM, int NN, int m_1, long double *Xi)
{
    using namespace std;
        
        long double S, Eps;                  //Вспомогательные переменные
    long double norm;                  //Евклидова норма на n итерации
    long double norm_0;               //Евклидова норма начальной невязки
    int N;                           //Задаем кол-во разбиений по X
    int M;                          //Кол-во разбиений по Y
    int m;                         //m-мерное пространство
    double kof = 1;
    long double beta = 1.;
    int iter=0;
    
    M=MM;
    N=NN;
    m=m_1;
    Eps = 0.0001;
    long double h=(long double)1/N;
    long double co, si;
    long double max;
 
    
    //----------------------Объявление  и создание массивов---------------------//
    long double *X = new long double[(M+1)*(N+1)];    //Создание вектора Хи
    for(int j=0; j<M+1; j++)
        for(int i=0; i<N+1; i++)
            X[j*(N+1)+i]=Xi[j*(N+1)+i];
            
    long double *e1 = new long double[m+1]; //Создаем единичный вектор
    long double *e2 = new long double[2]; //Создаем вспомогательный единичный вектор для хранения промежуточных вычислений
    long double *nu = new long double[m];    //Создаем матрицу ню
    long double *r = new long double[(M+1)*(N+1)];   //Создаем вектор невязки
    for(int i=0; i<(M+1)*(N+1); i++)
        r[i]=0;
    long double *r1 = new long double[(M+1)*(N+1)];   //Создаем новый вектор невязки
    for(int i=0; i<(M+1)*(N+1); i++)
        r1[i]=0;
    
    long double *teta = new long double[(M+1)*(N+1)*m]; //Создание вектора Тета
    for(int i=0; i<(M+1)*(N+1)*m; i++)
        teta[i]=0;
    long double *po = new long double[(M+1)*(N+1)];   //Создание вспомогательного вектора po
    for(int i=0; i<(M+1)*(N+1); i++)
        po[i]=0;
 
    long double *po1 = new long double[(M+1)*(N+1)];   //Создание вспомогательного вектора po
    for(int i=0; i<(M+1)*(N+1); i++)
        po1[i]=0;
 
    long double *po2 = new long double[(M+1)*(N+1)];   //Создание вспомогательного вектора po
    for(int i=0; i<(M+1)*(N+1); i++)
        po2[i]=0;
 
 
    long double *sig = new long double[(m+1)*m]; //Создание матрицы сигма
    for(int i=0; i<(m+1)*m; i++)
            sig[i]=0;
 
    //------------------------Создание элементов матрицы А------------------------//
    
    long double *a00 = new long double[(M-1)*N];
    for(int i=0; i<(M-1)*N; i++) a00[i]=4.;
 
    long double *a01 = new long double[(M-1)*N]; 
    for(int i=0; i<(M-1)*N-N; i++)
    {
        a01[i]=-1.;
        if( i%N == 0 )
            a01[i]=-0.5;//a01[i]=-0.5;
    }
        
    for(int i=(M-1)*N-N; i<(M-1)*N; i++) a01[i]=0;
    
    long double *a_10 = new long double[(M-1)*N];
    for(int i=0; i<(M-1)*N; i++)
    {
        if( i%N !=0 )
            a_10[i]=-1.;
        else
        {
            a_10[i]=0;
            a00[i]=2.; //a00[i]=2.;
        }
    }
    
    long double *a10 = new long double[(M-1)*N];
    for(int i=0; i<(M-1)*N; i++)
    {
        if( (i+1)%N !=0 )
            a10[i]=-1.;
        else
            a10[i]=0;
    }
 
    long double *a0_1 = new long double[(M-1)*N];
    for(int i=0; i<N; i++) a0_1[i]=0;
    for(int i=N; i<(M-1)*N; i++)
    {
        a0_1[i]=-1.;
        if( i%N == 0 )
            a0_1[i]=-0.5; //a0_1[i]=-0.5;
    }
 
    long double *l0_1 = new long double[(M-1)*N]; //Создание элементов матрицы L
    for(int i=0; i<(M-1)*N; i++) l0_1[i]=0;
    long double *l_10 = new long double[(M-1)*N];
    for(int i=0; i<(M-1)*N; i++) l_10[i]=0;
    long double *l00 = new long double[(M-1)*N];
    for(int i=0; i<(M-1)*N; i++) l00[i]=0;
 
    long double *u00 = new long double[(M-1)*N]; //Создание элементов матрицы U
    for(int i=0; i<(M-1)*N; i++) u00[i]=1;
    long double *u10 = new long double[(M-1)*N];
    for(int i=0; i<(M-1)*N; i++) u10[i]=0;
    long double *u01 = new long double[(M-1)*N];
    for(int i=0; i<(M-1)*N; i++) u01[i]=0;
 
    //-------------------------------------------------------------------------------//
 
    long double *sig2 = new long double[2*m]; //Создание вспомогательной матрицы сигма для хранения промежуточных вычислений
    for(int i=0; i<2*m; i++)
        sig2[i]=0;
 
 
    ofstream toch_2;
    toch_2.open("tochnoe_obl_2.txt");
 
    long double *toch2 = new long double[(N+1)*(M+1)];  //Создание массива для хранения точного решения
 
    for(int j=1; j<M; j++)
        for(int i=0; i<N; i++)
            toch2[j*(N+1)+i]=resh(i*h,-1.+j*h);             //Вычисление точного решения
 
    for(int i=0; i<N+1; i++)
    {
        toch2[i]=0;            //Нижнее краевое условие
        toch2[M*(N+1)+i]=0;    //Верхнее краевое условие
    }
 
    for(int i=1; i<M; i++)
    {
        //toch2[i*(N+1)]=0;       //Левое краевое условие
        toch2[i*(N+1)+N]=0;    //Правое краевое условие
    }
 
    for(int i=0; i<(N+1)*(M+1); i++)    //Запись точного решения в файл
        toch_2<<toch2[i]<<endl;
 
    toch_2.close();
    
    
 
    //----------------------Начало цикла---------------------//
 
    while(true)
        {
         Тело программы
        }
 
        очищаю память
 
delete [] toch2;
delete [] teta;
delete [] X;
delete [] e1;
delete [] e2;
delete [] nu;
delete []  r;
delete [] r1;
delete [] po;
delete [] po1;
delete [] po2;
delete [] sig;
delete [] sig2;
delete [] a_10;
delete [] a00;
delete [] a10;
delete [] a0_1;
delete [] l0_1;
delete [] l_10;
delete [] l00;
delete [] u00;
delete [] u10;
delete [] u01; 
    
     return q;
}   
    
{
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru