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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2009, 18:19   #1
Lawliet32
Пользователь
 
Аватар для Lawliet32
 
Регистрация: 26.11.2009
Сообщений: 34
По умолчанию (BC 3.1) Распределение памяти!

Доброго времени суток!

Есть программа, которая работает корректно, но при завершении работы выскакивает с ошибкой.

Как я понимаю проблемы с выделением памяти.
Вот примерный алгоритм работы с памятью в моей программе:


конструкторы:
Код:
HighPrecision::HighPrecision()
{
	count=0;
	nums=new Nums[MAX]; //Nums - мой класс, содержащий указатель на строку
}

HighPrecision::Nums::Nums()
{
	posp=0;
	dcount=0;
	minus=0;
	num=new char[255]; //собственно та самая строка.
}
Деструкторы:
Код:
HighPrecision::~HighPrecision()
{
	count=0;
	delete nums;
}

HighPrecision::Nums::~Nums()
{
	posp=0;
	dcount=0;
	delete num;
}

При попытки сделать перераспределение данные вообще отображаются некоректно!

вот как примерно я обращаюсь к своим данным:
Код:
HighPrecision hp;

hp.nums[0]+hp.nums[1];
Изучаю Си\Си++
Lawliet32 вне форума Ответить с цитированием
Старый 28.12.2009, 19:00   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Для динамически выделенных массивов(new[]) используется соответствующий оператор их освобождения(delete[])
Код:
delete[] nums;
delete[] num;
netrino вне форума Ответить с цитированием
Старый 28.12.2009, 23:22   #3
Lawliet32
Пользователь
 
Аватар для Lawliet32
 
Регистрация: 26.11.2009
Сообщений: 34
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Для динамически выделенных массивов(new[]) используется соответствующий оператор их освобождения(delete[])
Код:
delete[] nums;
delete[] num;
исправил... все равно при трассировке выкидывает как только дохожу до закрытой фигурной скобки, т.е.

delete[] nums;
} //указатеь на этой строке и нажимая кнопку F7 выкидывает... в чем мб проблема?)
Изучаю Си\Си++
Lawliet32 вне форума Ответить с цитированием
Старый 28.12.2009, 23:25   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

По коду, который Вы предоставили так и не скажешь ) Есть подозрения, что Вы передаёте объект класса в какую-то ф-цию по значению, но не определив конструктор копирования, при этом при выходе из ф-ции вызывается деструктор. Таким образом система пытается освободить память 2 или больше раз, что приводит к вылету

Последний раз редактировалось netrino; 28.12.2009 в 23:42.
netrino вне форума Ответить с цитированием
Старый 28.12.2009, 23:29   #5
Lawliet32
Пользователь
 
Аватар для Lawliet32
 
Регистрация: 26.11.2009
Сообщений: 34
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
По коду, который Вы предоставили так и не скажешь ) Есть подозрения, что Вы передаёте объект класса в какую-то ф-цию по значению, при этом не определив конструктор копирования, при этом при выходе из ф-ции вызывается деструктор. Таким образом система пытается освободить память 2 или больше раз, что приводит к вылету
конструкторов копий я не делал... щас попробую дописать...

и можно по подробней насчет "передавая объект класса в функцию !по значению!"

п.с. вылетает, когда захожу в перегруженные операторы
Изучаю Си\Си++

Последний раз редактировалось Lawliet32; 28.12.2009 в 23:31.
Lawliet32 вне форума Ответить с цитированием
Старый 28.12.2009, 23:31   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

по значению значит не по ссылке/указателю
Код:
class A { int _m; };

void f(A o) { }    // передача по значению, при этом вызывается конструктор копирования
void d(A& o) { } // передача по ссылке(КК не вызывается)
void c(A* o) { } // передача по указателю(КК не вызывается)
netrino вне форума Ответить с цитированием
Старый 28.12.2009, 23:39   #7
Lawliet32
Пользователь
 
Аватар для Lawliet32
 
Регистрация: 26.11.2009
Сообщений: 34
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
по значению значит не по ссылке/указателю
Код:
class A { int _m; };

void f(A o) { }    // передача по значению, при этом вызывается конструктор копирования
void d(A& o) { } // передача по ссылке(КК не вызывается)
void c(A* o) { } // передача по указателю(КК не вызывается)
Спасибо разобрался!

Программа очень большая конструкторы копирования дописал на всякий случай...

Теперь не выкидывает из программы... а когда завершаю работу... появляется синий рабочий экран BC 3.1 нажимаю Alt+X (Exit) и появляется ошибка UNHANDLED EXCEPTION как я понимаю необработанное исключение где-то в коде... Нет ли у Вас быстрого способа найти вредный код?
Изучаю Си\Си++
Lawliet32 вне форума Ответить с цитированием
Старый 28.12.2009, 23:44   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ну раз ошибка появляется при выходе из борланда, то скорее всего к Вашей программе это отношения не имеет )
Трудно что-либо говорить, не имея возможности взглянуть на код
netrino вне форума Ответить с цитированием
Старый 28.12.2009, 23:49   #9
Lawliet32
Пользователь
 
Аватар для Lawliet32
 
Регистрация: 26.11.2009
Сообщений: 34
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Ну раз ошибка появляется при выходе из борланда, то скорее всего к Вашей программе это отношения не имеет )
Трудно что-либо говорить, не имея возможности взглянуть на код
Код действительно большой, но я могу предоставить...

Трассируя программу доходит до конца просто отлично и выходит из борланда замечательно...

если у Вас есть время могу предоставить код (работа с числами большой точности - длинная арифметика с плавающей точкой) сложение отлично работает а вот вычитание и умножение шалят(((

напишите если заинтеристует е-mail в личку = )
Изучаю Си\Си++
Lawliet32 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на массивы.Язык С.Динамическое распределение памяти Bella Помощь студентам 1 22.10.2009 17:45
Динамическое распределение памяти ManU Общие вопросы Delphi 0 13.10.2009 10:24
Распределение динамической памяти в Borland C++ 3.1! CePryH Помощь студентам 3 15.06.2009 23:59
Распределение памяти Jeni Общие вопросы Delphi 6 31.03.2008 19:59