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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2012, 17:12   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Зацикливание при удаление памяти

Всем привет, всем великим programmersforum программистам, столкнулся с очень странной ситуацией, а точнее с освобождением памяти.
Вообщем обратите внимание на деструктор, если использовать оператор delete при удаление памяти, программа зацикливается, если использовать free(pTest[i]) тогда память удаляется без проблем. В чем проблема?

Код:
const int MAX_VECT = 10;

class TestEx
{
public:
 TestEx();
 ~TestEx(void);
 int Vect;

 void ShowVect(int Size);

private:

protected:

};
TestEx *pTest[MAX_VECT];

TestEx::TestEx()
{
 this->Vect = rand() % 100;
};

TestEx::~TestEx()
{
 std::cout << "\nCalled destructor\n";
	
 for (int i = 0; i < MAX_VECT; i++)
 {
  if (pTest[i] != NULL)
  {
   delete pTest[i]; // free(pTest[i];
   pTest[i] = NULL;
  }
 } 

 for (int i = 0; i < MAX_VECT; i++)
  printf("[%d]", pTest[i]);

 std::cin.get();
};

void TestEx::ShowVect(int Size)
{
 for (int i = 0; i < Size; i++)
  printf("[%d]", pTest[i]->Vect);
}

int main(void)
{
 TestEx Test;

 srand(time(0));

 for (int i = 0; i < MAX_VECT; i++)
  pTest[i] = new TestEx();

 pTest[0]->Vect = 25;

 Test.ShowVect(10);
	
 std::cin.get(); return 0;
}

Последний раз редактировалось coNsept; 23.06.2012 в 17:14.
coNsept вне форума Ответить с цитированием
Старый 23.06.2012, 17:37   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2coNsept
проблема в том, что ты написал глупость.
Цитата:
TestEx Test;

srand(time(0));

for (int i = 0; i < MAX_VECT; i++)
pTest[i] = new TestEx();

pTest[0]->Vect = 25;

Test.ShowVect(10);

std::cin.get(); return 0;
как только TestEx Test; выйдет из области видимости, вызовется его деструктор
Код:
TestEx::~TestEx()
{
 std::cout << "\nCalled destructor\n";
	
 for (int i = 0; i < MAX_VECT; i++)
 {
  if (pTest[i] != NULL)
  {
   delete pTest[i]; // free(pTest[i];
   pTest[i] = NULL;
  }
 }
в котором удаляются элементы опять же класса TestEx, которые точно так же вызывают этот же деструктор. бесконечная рекурсия -> переполнение стека. при использовании free деструктор просто не вызывается. очистится память корректно или нет неясно, ибо new нужно применять в паре с delete, а malloc - с free.
вывод: непонимание рекурсии. марш читать SICP.

ПС.
Цитата:
std::cin.get(); return 0;
за это нужно просто линчевать, ящитаю. это прощается только первокурсникам, которые впервые увидели турбо си какой нить.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 23.06.2012 в 17:40.
pproger вне форума Ответить с цитированием
Старый 23.06.2012, 17:47   #3
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Цитата:
за это нужно просто линчевать, ящитаю. это прощается только первокурсникам, которые впервые увидели турбо си какой нить.
А что я такого тут сделал?
За ответ и за направление спасибо, ты как палочка выручалочка. Теперь все понятно, почему происходит так
Ну а вообще, я программист не профессионал а любитель, поэтому учусь и только учусь. Вот так вот черпая информацию, от одного человека или от другого ну или с какой-нить книженции или статьи.

п.с pproger у тебя скайп есть? можешь в личку скинуть?

Последний раз редактировалось coNsept; 23.06.2012 в 17:50.
coNsept вне форума Ответить с цитированием
Старый 23.06.2012, 17:51   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2coNsept
Цитата:
std::cin.get();
зачем?

Цитата:
п.с pproger у тебя скайп есть? можешь в личку скинуть?
слева ж написан
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 23.06.2012 в 17:54.
pproger вне форума Ответить с цитированием
Старый 23.06.2012, 18:00   #5
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Ну вообще чтобы остановиться и увидеть результат, я код писал на скорую руку просто чтобы проверить. А почему cin.get и в главной функции и в деструкторе, потому что останавливался в деструкторе и после ShowVect (после, присутствовал еще код). Код выложил не весь а только тот момент который интересует остальное убрал, почему не удалил один из cin.get() просто забыл про него, если ты об этом.
coNsept вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов деструктора класса при присвоении реализумому методу итерфейса "nil" при освобождении памяти DLL. LISTAT Общие вопросы Delphi 1 08.05.2012 11:05
Ошибка при очистке памяти alexey_kip Visual C++ 3 12.02.2012 11:55
Зацикливание при нажатии клавиши в DirectInput Sargonass Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 14.01.2012 19:42
выделение дин памяти и удаление Nekesh Общие вопросы C/C++ 2 11.10.2010 13:30
создание dll при старте приложения и удаление при завершении TyoshA Общие вопросы Delphi 7 13.07.2009 13:56