Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Автоматическое управление памятью


Автор: ManiaK 3.9.2004, 15:47
Народ Сишный! Слышал я раньше, что в VC (а может и на уровне какой-то стандартной библиотеки) реализовано автоматическое управление памятью. Так вот недавно я с ним столкнулся вплотную - создал объект с помощью new, а потом в деструкторе одного класса(объект - член класса) хочу этот объект удалить с помощь delete. Фиг! Компилятор мне с усмешкой говорит, что объект уже, мол, давно не существует! Опоздал, простофиля! Надо сказать - переменная класса объявлена статически в глобальной области. Как мне сие умное творение отключить? Зачем - не спрашивайте, посмотрите на ник и всё понятно станет biggrin.gif
Буду благодарен любой идее...

Автор: chipset 3.9.2004, 15:50
Как он это говорит? access violation?

Автор: ManiaK 3.9.2004, 15:51
Типа того, счас точно не помню. Сам проект дома(я на работе).

Автор: Vyacheslav 3.9.2004, 15:52
См auto_ptr

Автор: chipset 3.9.2004, 15:53
Так я понял?
Код

static object *pObj;
class Foo
{

Foo() {pObj = new object();}
DoSomeWork() {/*...*/};
~Foo() {delete pObj;}//вот тут то тебя и ловят...
};

Автор: Олег М 3.9.2004, 15:55
Цитата(ManiaK @ 3.9.2004, 18:47)
Слышал я раньше, что в VC (а может и на уровне какой-то стандартной библиотеки) реализовано автоматическое управление памятью.

Да? Это где ж ты такое слышал?

Цитата(ManiaK @ 3.9.2004, 18:47)
Так вот недавно я с ним столкнулся вплотную - создал объект с помощью new, а потом в деструкторе одного класса(объект - член класса) хочу этот объект удалить с помощь delete. Фиг! Компилятор мне с усмешкой говорит, что объект уже, мол, давно не существует! Опоздал, простофиля!

Дай лучше код позырить - вдруг и правда автоматическое управление памятью! А так, на словах, нифига не понятно.

Автор: ManiaK 3.9.2004, 15:55
Нет, не так. Вот:
class X
{
X() { i = new int[..]; }
virtual ~X() { delete [] i; }// Вот тута бьютьsad.gif
int i;
};

X x;// А вот объект класса

Автор: Олег М 3.9.2004, 16:01
Вот так попробуй
Код

class X
{
X() { i = new int[..]; }
virtual ~X() { delete [] i; }// Вот тута бьють
int *i;
};

Автор: chipset 3.9.2004, 16:03
Цитата
Слышал я раньше, что в VC (а может и на уровне какой-то стандартной библиотеки) реализовано автоматическое управление памятью.

_gc?

Автор: ManiaK 3.9.2004, 16:04
Я уже не мальчик по программерским меркам thumbs-up.gif
Это была просто опечатка. Именно так у меня и есть.

Автор: Domestic Cat 3.9.2004, 16:05
Цитата(chipset @ 3.9.2004, 07:03)
_gc?


http://www.developer.com/net/cplus/article.php/3366991

Автор: Олег М 3.9.2004, 16:07
Цитата(ManiaK @ 3.9.2004, 19:04)
Это была просто опечатка. Именно так у меня и есть.

Точно не где больше не удаляешь? Проверь остальной код, ошибка где-то там, управления памятью в VC, насколько мне известно нет.

Автор: chipset 3.9.2004, 16:08
Domestic Cat
Именно это я им ел в виду smile.gif
2Маньяк
Может у тебя в деструкторе локальная i есть?
А попробуй просто delete i;

Автор: ManiaK 3.9.2004, 16:09
Всё это я проверя уж раз двадца. Результат один - объект удаляется до меня. Именно по этому факту я и понял, что это либо глюк(мой или компилятора) либо автоматическое высвобождение...

Автор: chipset 3.9.2004, 16:11
Цитата
Именно по этому факту я и понял, что это либо глюк(мой или компилятора) либо автоматическое высвобождение...

Автоматического освобождени в чистом С++ AFAIK нема..
Значит это твой глюк

Автор: ManiaK 3.9.2004, 16:21
Ок, я дома сделаю простенький проект. Скомпилю и посмотрю. Если будет таже фигня, прошу проделать мой опыт ещё кому-нибудь...

Автор: sergejzr 3.9.2004, 16:54
Попробуй дебаггером отловить место, откуда деструкция происходит первый раз wink.gif .

В Си++ такое случается иногда. Осоменно там, где бы никогда не догадался... Передал указатель куда нибудь, а там его раз и деструктировали smile.gif. Такое бывает если const не пользуешься smile.gif
Или Длльки деструктируют чё нить, или ДЛЛь в дебаг скомпилена smile.gif

Если окажется, что при первом вызове деструктора поинтер уже кривой, то придётся конечно долго искать.. Есть правда неплохая утилита. Ловит утечку памяти и возникновение ислючений...

Счас линьк посмотрю...
http://www.codeproject.com/tools/leakfinder.asp

Заинклудай в свой проект. Он создают файл с ексцепшонами и файл с утечкой. Очень удобно smile.gif
Но недеюсь всё таки не придётся столько искать.

А насчёт автоматики в Вижуале biggrin.gif Не, не слышал никогда. Там проверок не нужных (нужных тоже конечно) много..

Всегда, когда вылезает assert - это Вижуал smile.gif
ПС:
Кстати Компилятор не может такого говорить smile.gif. Об обьектах известно только, когда программа выполняется smile.gif

Автор: chipset 3.9.2004, 17:02
Цитата
Всегда, когда вылезает assert - это Вижуал

Вот это уж да mad.gif
Насчёт мемориликов, БаундсЧекером можешь пройтись.. (я правда никогда не пользовался :-/)

Автор: ManiaK 20.9.2004, 11:20
Итак. Эпопея продолжается.
Код

class X
{
X() { i = new int[..]; }
virtual ~X() { delete [] i; }// Вот тута бьють
int *i;
};

int main(int& argc, char* argv[])
{
   X x;

   return 0;
}


Объект x удаляется раньше, чем вызывается для него деструктор. Парадокс? Причём если сделать так:

Код

int main(int& argc, char* argv[])
{
   {
       X x;
   }

   return 0;
}


Усё будет в порядке. hmmm.gif

Автор: chipset 20.9.2004, 11:24
Код

X() { i = new int[..]; }

Создание обьекта на стёке? withstupid.gif (у конструктора вообще такая, фигня может быть?)

Автор: ManiaK 20.9.2004, 12:22
Не понял, при чём тут приведённая цитата и стек. Создаётся динамический объект.

Автор: Vyacheslav 20.9.2004, 12:23
C++Builder 6. Без проблем
Код

сlass X
{
public:
X() { i = new int[100]; }
virtual ~X() { delete [] i;   }
int *i;
};

int main(int& argc, char* argv[])
{
X x;
return 0;
}

Автор: chipset 20.9.2004, 12:28
Visual C++ 2003, всё нормально...

Автор: ManiaK 20.9.2004, 12:34
Сории за проступ. Код немного другой. Не работает именно в 6ой студии. Может это у них глюк?
Код

class X
{
public:
X() : i((int*)malloc(120)) { }
virtual ~X() { free(i); }

int* i;
};

int _tmain(int argc, _TCHAR* argv[])
{
X x;

return 0;
}

Автор: chipset 20.9.2004, 12:37
всё пашет... :-/
Добавлено @ 12:37
Цитата
Может это у них глюк?

Скажем так - небольшая особенность tounge.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)