Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Автоматическое управление памятью, Задолбало:) 
:(
    Опции темы
ManiaK
Дата 3.9.2004, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



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


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Как он это говорит? access violation?


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
ManiaK
Дата 3.9.2004, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



Типа того, счас точно не помню. Сам проект дома(я на работе).
PM MAIL WWW   Вверх
Vyacheslav
Дата 3.9.2004, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



См auto_ptr


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
chipset
Дата 3.9.2004, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Так я понял?
Код

static object *pObj;
class Foo
{

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



--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Олег М
Дата 3.9.2004, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



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

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

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

Дай лучше код позырить - вдруг и правда автоматическое управление памятью! А так, на словах, нифига не понятно.
PM MAIL ICQ   Вверх
ManiaK
Дата 3.9.2004, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



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

X x;// А вот объект класса
PM MAIL WWW   Вверх
Олег М
Дата 3.9.2004, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Вот так попробуй
Код

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

PM MAIL ICQ   Вверх
chipset
Дата 3.9.2004, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



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

_gc?


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
ManiaK
Дата 3.9.2004, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



Я уже не мальчик по программерским меркам thumbs-up.gif
Это была просто опечатка. Именно так у меня и есть.
PM MAIL WWW   Вверх
Domestic Cat
Дата 3.9.2004, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 3
Всего: 172



Цитата(chipset @ 3.9.2004, 07:03)
_gc?


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



--------------------

PM   Вверх
Олег М
Дата 3.9.2004, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



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

Точно не где больше не удаляешь? Проверь остальной код, ошибка где-то там, управления памятью в VC, насколько мне известно нет.
PM MAIL ICQ   Вверх
chipset
Дата 3.9.2004, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



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


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
ManiaK
Дата 3.9.2004, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



Всё это я проверя уж раз двадца. Результат один - объект удаляется до меня. Именно по этому факту я и понял, что это либо глюк(мой или компилятора) либо автоматическое высвобождение...
PM MAIL WWW   Вверх
chipset
Дата 3.9.2004, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



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

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


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
ManiaK
Дата 3.9.2004, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



Ок, я дома сделаю простенький проект. Скомпилю и посмотрю. Если будет таже фигня, прошу проделать мой опыт ещё кому-нибудь...
PM MAIL WWW   Вверх
sergejzr
Дата 3.9.2004, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Попробуй дебаггером отловить место, откуда деструкция происходит первый раз 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


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
chipset
Дата 3.9.2004, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Цитата
Всегда, когда вылезает assert - это Вижуал

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


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
ManiaK
Дата 20.9.2004, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



Итак. Эпопея продолжается.
Код

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
PM MAIL WWW   Вверх
chipset
Дата 20.9.2004, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Код

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

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


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
ManiaK
Дата 20.9.2004, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



Не понял, при чём тут приведённая цитата и стек. Создаётся динамический объект.
PM MAIL WWW   Вверх
Vyacheslav
Дата 20.9.2004, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



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;
}



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
chipset
Дата 20.9.2004, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Visual C++ 2003, всё нормально...


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
ManiaK
Дата 20.9.2004, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



Сории за проступ. Код немного другой. Не работает именно в 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;
}

PM MAIL WWW   Вверх
chipset
Дата 20.9.2004, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



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

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


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0707 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.