Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2010, 04:57   #1
Einsttein
 
Регистрация: 13.03.2010
Сообщений: 9
Вопрос освобождение динамически выделенной памяти

Собстна, как освободить память? оО Ниже следующий код не работает =(
Код:
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
struct factor
{
	double* arg;   // коэффициент при комплексном аргументе s ;
	int max_degree;  // старшая степень комплексного аргумента s;
	~factor(){
		delete[] arg;
	}
};


int _tmain(int argc, _TCHAR* argv[])
{
	factor* A;
	A = new factor[10];
        for(int i = 0; i < 10; i++)
                A[i].arg = new double[10];
	// {...код...] бла бла бла
	delete[] A;
	return 0;
}

Последний раз редактировалось Einsttein; 26.05.2010 в 13:45.
Einsttein вне форума Ответить с цитированием
Старый 26.05.2010, 08:54   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
struct factor
{
double* arg; // коэффициент при комплексном аргументе s ;
int max_degree; // старшая степень комплексного аргумента s;
~factor(){
Хм... А разве в Си структура может быть классом???
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.05.2010, 09:06   #3
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Хм... А разве в Си структура может быть классом???
Может. Ответ: в классе нету конструктора без параметров, в котором должна выделяться память под arg.
Carbon вне форума Ответить с цитированием
Старый 26.05.2010, 09:10   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,716
По умолчанию

2 Stilet
Это C++... И там может.
p51x вне форума Ответить с цитированием
Старый 26.05.2010, 13:43   #5
Einsttein
 
Регистрация: 13.03.2010
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Carbon Посмотреть сообщение
Может. Ответ: в классе нету конструктора без параметров, в котором должна выделяться память под arg.
Так как можно память освободить? Память под вектор arg выделяется не конструктором (его собственно нет =) ), а в коде (отредактировал начальный код, что б было лучше понятно).
Einsttein вне форума Ответить с цитированием
Старый 26.05.2010, 14:02   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Что значит код не работает?
А вообще неправильная политика по работе с памятью. Кто её выделил, тот и должен удалять, иначе рано или поздно полезут утечки памяти и сложно будет найти источник проблемы.
pu4koff вне форума Ответить с цитированием
Старый 26.05.2010, 14:09   #7
Einsttein
 
Регистрация: 13.03.2010
Сообщений: 9
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Что значит код не работает?
А вообще неправильная политика по работе с памятью. Кто её выделил, тот и должен удалять, иначе рано или поздно полезут утечки памяти и сложно будет найти источник проблемы.
ОС Windows инициировала точку останова в TimeDelay2.exe.
Это может быть вызвано повреждением кучи и указывает на ошибку в TimeDelay2.exe или в одной из загруженных им DLL.

Последний раз редактировалось Einsttein; 26.05.2010 в 14:37.
Einsttein вне форума Ответить с цитированием
Старый 26.05.2010, 14:40   #8
Einsttein
 
Регистрация: 13.03.2010
Сообщений: 9
По умолчанию

Вот полный код:
Код:
double time_delay(VPath* route, double** Pst, int L, double* CLoad) // CLoad (Channel Loading) загрузка канала, L - длина пакета, Ts - время задержки, V - матрица пропускных способностей ЛЦТ-ов, Route - набор виртуальных путей;
{
	double pro = 0, pro2 = 0;
	int Vb = 64000;                                // скорость вокодера;
	double Tq = Td - (double)(L - Hip)/(double)Vb; // заданное время пребывания пакета в пути (исключая время пакетизации);
	double intensity;                              // intensity - интенсивность потока;
	double result = 0;
	factor* A;
	do{
		A = new factor[route->lenght + 1];   // вектор коэффициентов;
		for(int num_A = 0; num_A< route->lenght + 1; num_A++){
			A[num_A].arg = new double[route->lenght];
			A[num_A].max_degree = 0;
			A[num_A].denominator = 0;
			A[num_A].denominator_degree = 1;
			for(int j=0;j< route->lenght + 1; j++){
				if(j != 0) A[num_A].arg[j] = 0;
				else A[num_A].arg[j] = 1;
			}
		}
		for(int i=0; i < route->lenght; i++){            // i - номер вершины в пути
			intensity = ((double)V[route->knot[i]-1][route->knot[i+1]-1] / (double)(L + Hna))*(1 - CLoad[ElementNum (route->knot[i]-1, route->knot[i+1]-1, num_knots)]);
			for(int num_A = 0; num_A < route->lenght; num_A++){         // num_A - номер коэффициента
				if(num_A != i){					// проверка умножения №1
					if(A[num_A].denominator != intensity){  // проверка умножения №2
						for(int k = A[num_A].max_degree + 1; k>=0; k--){          // k - степень аргумента S
							if(k == 0)
								A[num_A].arg[k] = A[num_A].arg[k] * intensity;
							else{
								if(k == A[num_A].max_degree)
									A[num_A].arg[k] = A[num_A].arg[k-1] + intensity;
								else{
									if(k == A[num_A].max_degree + 1)
										A[num_A].arg[k] = 1;
									else
										A[num_A].arg[k] = A[num_A].arg[k] * intensity + A[num_A].arg[k-1];
								}
							}
						}
						A[num_A].max_degree++;
					}
					else
						A[num_A].denominator_degree++;
				}
				else
					A[num_A].denominator = intensity;
			}
			A[route->lenght].arg[0] = A[route->lenght].arg[0] * intensity;
		}
		for(int num_A = 0; num_A < route->lenght; num_A++){
			for(int s = 0; s < route->lenght; s++)
				if(s != num_A){
					if (A[num_A].arg[num_A] == 0){
						for (int i = 0; i < route->lenght + 1; i++)
							A[i].arg[num_A] = A[i].arg[num_A] + A[i].arg[num_A+1];
					}
					intensity = A[num_A].arg[s]/A[num_A].arg[num_A];
					for(int i = 0; i < route->lenght + 1; i++)
						A[i].arg[s] = A[i].arg[s] - intensity * A[i].arg[num_A];
				}
		}
		for(int num_A = 0; num_A < route->lenght; num_A++){
			A[num_A].arg[num_A] = A[route->lenght].arg[num_A]/A[num_A].arg[num_A];
			if(A[num_A].arg[num_A] != 0){
				intensity = ((double)V[route->knot[num_A]-1][route->knot[num_A+1]-1] / (double)(L + Hna))*(1 - CLoad[ElementNum (route->knot[num_A]-1, route->knot[num_A+1]-1, num_knots)]);
				pro = factorial(A[num_A].denominator_degree - 1);
				pro2 = integral(A[num_A].denominator_degree - 1,Tq,intensity);
				result = result + A[num_A].arg[num_A] * Pst[route->knot[0]-1][route->knot[route->lenght]-1] / factorial(A[num_A].denominator_degree - 1) * integral(A[num_A].denominator_degree - 1,Tq,intensity);
			}
		}
		//for(int num_A = 0; num_A< route->lenght + 1; num_A++)
		//	A[num_A].~factor();
		delete[] A;
		A = (factor*)NULL;
		route = route->next_vpath;
	}while(route != (VPath*)NULL);
	return result = 1 - result;
}
Einsttein вне форума Ответить с цитированием
Старый 26.05.2010, 14:43   #9
Einsttein
 
Регистрация: 13.03.2010
Сообщений: 9
По умолчанию

Тело структуры
Код:
struct factor
{
	double* arg;   // коэффициент при комплексном аргументе s ;
	int max_degree;  // старшая степень комплексного аргумента s;
	double denominator; // модуль корня знаменателя простейшей дроби;
	int denominator_degree; // степень знаменателя простейшей дроби;
	~factor(){
		delete[] arg;
	}
};
Einsttein вне форума Ответить с цитированием
Старый 26.05.2010, 15:40   #10
Einsttein
 
Регистрация: 13.03.2010
Сообщений: 9
По умолчанию

Всем огромное спасибо за помощь! Ошибку нашел, в строках
Код:
for(int j=0;j< route->lenght + 1; j++){
				if(j != 0) A[num_A].arg[j] = 0;
				else A[num_A].arg[j] = 1;
			}
происходило переполнение буфера Я балбес xD

Тему можно закрыть.
Einsttein вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Освобождение памяти Seran4ek Общие вопросы Delphi 7 21.12.2009 18:07
Освобождение памяти PUH Помощь студентам 1 22.11.2009 17:14
Освобождение памяти VadEr Общие вопросы Delphi 2 17.04.2009 22:23
Освобождение памяти AlexandrSid Общие вопросы Delphi 3 02.02.2009 13:45
Освобождение Памяти в Си volotsky Помощь студентам 2 16.12.2008 22:36