Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

утечек памяти нет, а New выбрасывает Exception-ы после долгой работы. почему ?

1.0K
13 февраля 2006 года
diesel_den
169 / / 22.12.2005
Что бы это могло быть? Какие операции впринципе могут приводить к краху ТАКИХ ВАЖНЫХ системных функций ? Это же, например, не попытка обращения к памяти, которая потерпит крах при недопустимом адресе. Я же только говорю, что мне нужно немножко памяти, которой у системы ещё прудь пруди. С чего бы это вдруг система не можут выделить немножко (байт 100) памяти ?
Страницы:
14K
13 февраля 2006 года
pingwinlin
7 / / 05.02.2006
Цитата:
Originally posted by diesel_den
Что бы это могло быть? Какие операции впринципе могут приводить к краху ТАКИХ ВАЖНЫХ системных функций ? Это же, например, не попытка обращения к памяти, которая потерпит крах при недопустимом адресе. Я же только говорю, что мне нужно немножко памяти, которой у системы ещё прудь пруди. С чего бы это вдруг система не можут выделить немножко (байт 100) памяти ?


Видать память засорил. Приведи код.

1.0K
13 февраля 2006 года
diesel_den
169 / / 22.12.2005
Цитата:
Originally posted by pingwinlin
Видать память засорил. Приведи код.


1) Код огромен, не представляется возможным его привести. Дело в том, что new вызывается во многих местах, а exception выдаёт в любом из них, так что возникает вопрос, может ли это вообще быть ошибка в моём коде.
2) Как это засорил память, если я специально смотрю разными прогами, скока эта прога занимает памяти и вижу, что утечек памяти нет. Я недавно устранил утечку памяти.

351
13 февраля 2006 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by diesel_den
1) Код огромен, не представляется возможным его привести. Дело в том, что new вызывается во многих местах, а exception выдаёт в любом из них, так что возникает вопрос, может ли это вообще быть ошибка в моём коде.
2) Как это засорил память, если я специально смотрю разными прогами, скока эта прога занимает памяти и вижу, что утечек памяти нет. Я недавно устранил утечку памяти.



можт у тя нет свободного куска памяти подходящего размера ? вовсяком случае рекомендую посмотреть содержимое Exception. В первом же случае почитай Александреску у него там есть про распределение памяти для небольших объектов. Книгу можно скачать на одной из ссылок самой первой темы этого форума. А также рекомендую глобально пересмотреть код с целью выявления случаев когда нужно и можно обойтись без new. То бишь без выделения памяти из кучи.

2.4K
14 февраля 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by diesel_den
Что бы это могло быть? Какие операции впринципе могут приводить к краху ТАКИХ ВАЖНЫХ системных функций ? Это же, например, не попытка обращения к памяти, которая потерпит крах при недопустимом адресе. Я же только говорю, что мне нужно немножко памяти, которой у системы ещё прудь пруди. С чего бы это вдруг система не можут выделить немножко (байт 100) памяти ?


Выложи здесь сообщение об ошибке
и фрагмент кода, кот соотв. этой ошибке.

398
14 февраля 2006 года
Alexandoros
630 / / 21.10.2005
try catch юзаеш? Ексепшн может еще быть при обращении к невалидному указателю, использовании delete [] вместо delete и т.д. Какие ексепшены нью кидает? Перегрузи нью и делете и считай скока байт выделяеш / освобождаеш. Запрашивай размер свободной кучи перед выделением, наконец.
534
14 февраля 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by PitxBull
можт у тя нет свободного куска памяти подходящего размера ? вовсяком случае рекомендую посмотреть содержимое Exception. В первом же случае почитай Александреску у него там есть про распределение памяти для небольших объектов. Книгу можно скачать на одной из ссылок самой первой темы этого форума. А также рекомендую глобально пересмотреть код с целью выявления случаев когда нужно и можно обойтись без new. То бишь без выделения памяти из кучи.



Попробуй вместо new/delete использовать malloc/free

3
14 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by HarryAxe
Попробуй вместо new/delete использовать malloc/free


Конкурс нелепых советов?

255
14 февраля 2006 года
Dart Bobr
1.4K / / 09.04.2004
Цитата:
Originally posted by Green
Конкурс нелепых советов?


:D
Я тоже дам совет. Наверное, память сгорела...не до конца.

1.0K
14 февраля 2006 года
diesel_den
169 / / 22.12.2005
Цитата:
Originally posted by Alexandoros
try catch юзаеш? Ексепшн может еще быть при обращении к невалидному указателю, использовании delete [] вместо delete и т.д. Какие ексепшены нью кидает? Перегрузи нью и делете и считай скока байт выделяеш / освобождаеш. Запрашивай размер свободной кучи перед выделением, наконец.


Как раз в try-catch я завернул каждую операцию new. И exception выскакивает не в конкретному участке кода, а в любом из этих try-catch.
> Какие ексепшены нью кидает? - не знаю, я юзаю catch(...) :(
> Запрашивай размер свободной кучи перед выделением, наконец. - А вот тут пожалуйста поподробней :) ...

3
14 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by diesel_den
Что бы это могло быть? Какие операции впринципе могут приводить к краху ТАКИХ ВАЖНЫХ системных функций ? Это же, например, не попытка обращения к памяти, которая потерпит крах при недопустимом адресе. Я же только говорю, что мне нужно немножко памяти, которой у системы ещё прудь пруди. С чего бы это вдруг система не можут выделить немножко (байт 100) памяти ?


А точно при new?
Какой объект создаешь? Что у него в конструкторе?

1.0K
14 февраля 2006 года
diesel_den
169 / / 22.12.2005
Цитата:
Originally posted by Green
А точно при new?
Какой объект создаешь? Что у него в конструкторе?


Точно. Я выделяю память под запись размером до 100 байт :)
Мне бы действительно как-то узнать скоко в этот момент мне динамической памяти доступно...

3
14 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by diesel_den
Точно. Я выделяю память под запись размером до 100 байт :)
Мне бы действительно как-то узнать скоко в этот момент мне динамической памяти доступно...


Что значит "выделяю память под запись"?
new с точки зрения ООП не выделяет память как таковую, а создает объект.
Ты создаешь объект типа char[100] ?

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

P.S. Телепаты все в отпуске, без кода нам тяжело что-либо говорить.

2.4K
14 февраля 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by diesel_den
Как раз в try-catch я завернул каждую операцию new. И exception выскакивает не в конкретному участке кода, а в любом из этих try-catch.
> Какие ексепшены нью кидает? - не знаю, я юзаю catch(...) :(
> Запрашивай размер свободной кучи перед выделением, наконец. - А вот тут пожалуйста поподробней :) ...



Выложи текстом: что у тебя твой catch( ... ) выловил и что этот try{} такого выдающегося содержит
Или это военные тайны?

2.4K
14 февраля 2006 года
dinasok51
219 / / 12.11.2005
Могу предположить следующее:

ты не поверяешь на NULL значение, возвращенное new(), и пытаешься обратиться к памяти, кот не выделена.
С известным эффектом.
398
14 февраля 2006 года
Alexandoros
630 / / 21.10.2005
Цитата:
Originally posted by diesel_den

> Запрашивай размер свободной кучи перед выделением, наконец. - А вот тут пожалуйста поподробней :) ...



Только теоретически. new юзает память выделяемую из хипа через HeapAlloc. Значит инфа полученая через HeapWalk должна быть правильной :) Вот и попробуй заюзать HeapWalk.

Хотя скорее всего проще подсчитать колво выделяемых байт, путем перегрузки new. Если колво байт доходит до предела физичиская память + размер подкачки, значит ликимемори.

1.0K
14 февраля 2006 года
diesel_den
169 / / 22.12.2005
Цитата:
Originally posted by Green
Ты создаешь объект типа char[100] ?

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


Это операция производиться многократно. По нормально эта память вскоре должна освобождаться оператором delete, что и происходит судя по Пуск/Программы/Администрирование/Производительность.
Я не дурак, просто сервера на сокетах пишу с недавнего сремени.

1.0K
14 февраля 2006 года
diesel_den
169 / / 22.12.2005
Цитата:
Originally posted by dinasok51
Могу предположить следующее:

ты не поверяешь на NULL значение, возвращенное new(), и пытаешься обратиться к памяти, кот не выделена.
С известным эффектом.


exception выбрасывает сама операция new, код далее не выполняется.

1.0K
14 февраля 2006 года
diesel_den
169 / / 22.12.2005
Цитата:
Originally posted by Alexandoros
Только теоретически. new юзает память выделяемую из хипа через HeapAlloc. Значит инфа полученая через HeapWalk должна быть правильной :) Вот и попробуй заюзать HeapWalk.

Хотя скорее всего проще подсчитать колво выделяемых байт, путем перегрузки new. Если колво байт доходит до предела физичиская память + размер подкачки, значит ликимемори.


Ну до "физичиская память + размер подкачки" тут далековато будет, но вот за HeapWalk спасибо (правда ещё не разбирался, что это такое вообще).

351
14 февраля 2006 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by Dart Bobr
:D
Я тоже дам совет. Наверное, память сгорела...не до конца.


Наверно материнка у него не от Intel ... :))))

351
14 февраля 2006 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by diesel_den
exception выбрасывает сама операция new, код далее не выполняется.


посмотри в выбрасоевом exception объекте наверно должно быть сообщение с причинами ошибками или код ошибки... не мучай людей.

3
14 февраля 2006 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by diesel_den
Это операция производиться многократно. По нормально эта память вскоре должна освобождаться оператором delete, что и происходит судя по Пуск/Программы/Администрирование/Производительность.
Я не дурак, просто сервера на сокетах пишу с недавнего сремени.


Для new char[100] должен быть delete[], а не просто delete.

534
14 февраля 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by diesel_den
exception выбрасывает сама операция new, код далее не выполняется.



Судя по документации, new может метнуть лишь один эксепшн: bad_alloc. Наверное, имеет смысл поставить обработчик new с помощью set_new_handler, и там глянуть ситуацию с памятью и, если надо, улучшить её, т.к. не надо забывать, что размер максимально допустимой с помощью new памяти ограничен не цифрой "физичиская память + размер подкачки", а размером heap'а для данного приложения

351
14 февраля 2006 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by Green
Для new char[100] должен быть delete[], а не просто delete.


Какая разница для него это просто блок памяти ... не будет же оно деструктор для каждого char вызывать... да и нет у char деструктора... скорее всего тут просто полная фрагментация памяти ...

351
14 февраля 2006 года
PitxBull
633 / / 22.12.2004
фрагментация памяти :

допустим допустимый размер кучи - 100 байт. И эти 100 байт распределены следующим образом:

00 - 29 Свободно ( 30 байт )
30 - 79 Занято ( 50 байт )
80 - 99 Свободно ( 20 байт )

Таким образом имеем ситуацию : утечек памяти нет, свободной памяти - 50 байт, но выделить программа может только 20 или 30 байт. Поэтому если запрашиваем 40 байт нас посылают....
534
14 февраля 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by PitxBull
фрагментация памяти :

допустим допустимый размер кучи - 100 байт. И эти 100 байт распределены следующим образом:

00 - 29 Свободно ( 30 байт )
30 - 79 Занято ( 50 байт )
80 - 99 Свободно ( 20 байт )

Таким образом имеем ситуацию : утечек памяти нет, свободной памяти - 50 байт, но выделить программа может только 20 или 30 байт. Поэтому если запрашиваем 40 байт нас посылают....



Подобную фрагментацию можно попробовать исправить с помощью HeapCompact(GetProcessHeap(), HEAP_NO_SERIALIZE). К тому же, возвращаемое ей значение укажет максимально возможный размер блока для выделения

351
14 февраля 2006 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by HarryAxe
Подобную фрагментацию можно попробовать исправить с помощью HeapCompact(GetProcessHeap(), HEAP_NO_SERIALIZE). К тому же, возвращаемое ей значение укажет максимально возможный размер блока для выделения


Ну подобную ситуацию она(HeapCompact) не исправит, а вот с помощью нее проверить максимально возможный размер блока для выдления перед вызовом new посоветовать автору темы можно и нужно.

534
14 февраля 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by PitxBull
Ну подобную ситуацию она(HeapCompact) не исправит, а вот с помощью нее проверить максимально возможный размер блока для выдления перед вызовом new посоветовать автору темы можно и нужно.



А вообще причину возникновения исключения можно узнать, заменив new на HeapAlloc() с флагом HEAP_GENERATE_EXCEPTIONS. Если память выделена не будет, вариантов исключений будет всего два: STATUS_NO_MEMORY и STATUS_ACCESS_VIOLATION (повреждение heap'а). По крайней мере, это значительно упростит процесс отыскание жука

1.0K
15 февраля 2006 года
diesel_den
169 / / 22.12.2005
Перегрузил new и delete и поставил синхронизацию.
Прога полностью глючить не перестала, но вроде как вероятность exception-а упала процентов на 95.
Хотя компилю я с опцией /MT !!!
Может эта опция не производит синхронизация new и delete, которую она должна обеспечивать?
351
15 февраля 2006 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by diesel_den
Перегрузил new и delete и поставил синхронизацию.
Прога полностью глючить не перестала, но вроде как вероятность exception-а упала процентов на 95.
Хотя компилю я с опцией /MT !!!
Может эта опция не производит синхронизация new и delete, которую она должна обеспечивать?


шизуха косит наши ряды......

255
16 февраля 2006 года
Dart Bobr
1.4K / / 09.04.2004
Цитата:
Originally posted by PitxBull
Наверно материнка у него не от Intel ... :))))


аффтар зачот :D :D :D

1.0K
16 февраля 2006 года
diesel_den
169 / / 22.12.2005
Цитата:
Originally posted by HarryAxe
А вообще причину возникновения исключения можно узнать, заменив new на HeapAlloc() с флагом HEAP_GENERATE_EXCEPTIONS. Если память выделена не будет, вариантов исключений будет всего два: STATUS_NO_MEMORY и STATUS_ACCESS_VIOLATION (повреждение heap'а). По крайней мере, это значительно упростит процесс отыскание жука


Чё-то у меня не выходит try/cartch откомпилить. Что тут не так?

 
Код:
try {
p = HeapAlloc(hHeap, HEAP_GENERATE_EXCEPTIONS, size); }
catch (STATUS_NO_MEMORY)
{Log("STATUS_NO_MEMORY", 3); }

Ругается на скобку перед STATUS_NO_MEMORY.
1.0K
16 февраля 2006 года
diesel_den
169 / / 22.12.2005
void* operator new(size_t size)
{
void* p;
__try {
__try {
p = HeapAlloc(hHeap, HEAP_GENERATE_EXCEPTIONS, size);
} __except (STATUS_NO_MEMORY) { Log("STATUS_NO_MEMORY", 3); }
} __except (STATUS_ACCESS_VIOLATION) { Log("STATUS_ACCESS_VIOLATION", 3); }
return p;
}

Ошибка: Cannot use __try in functions that require object unwinding !!!
1.0K
16 февраля 2006 года
diesel_den
169 / / 22.12.2005
Может всё таки можно с помощью try / catch сделать ????
1.0K
16 февраля 2006 года
diesel_den
169 / / 22.12.2005
unhandled exception in module <моя прога>.
Стэк вызова:
ntdll.dll!7c901230()
ntdll.dll!7c96c943()
ntdll.dll!7c949eb9()
Место ошибки в исходнике не показывается.
Хотя это обычная дебаг-версия с отладочной инфой.
1.0K
16 февраля 2006 года
diesel_den
169 / / 22.12.2005
void* operator new(size_t size)
{
void* p;
try {
p = HeapAlloc(hHeap, HEAP_GENERATE_EXCEPTIONS, size);
} catch (...)
{ printf("HeapAlloc catch (...)\n", 3); }
return p;
}
unhandled exception in module <моя прога>.
Стэк вызова:
ntdll.dll!7c901230()
ntdll.dll!7c96c943()
ntdll.dll!7c949eb9()
Место ошибки в исходнике не показывается.
Прога сглючивает при наростании кол-ва паралельных потоков (при их кол-ве около 10).
Хотя это обычная дебаг-версия с отладочной инфой.
2.4K
16 февраля 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by diesel_den
void* operator new(size_t size)
{
void* p;
try {
p = HeapAlloc(hHeap, HEAP_GENERATE_EXCEPTIONS, size);
} catch (...)
{ printf("HeapAlloc catch (...)\n", 3); }
return p;
}
unhandled exception in module <моя прога>.
Стэк вызова:
ntdll.dll!7c901230()
ntdll.dll!7c96c943()
ntdll.dll!7c949eb9()
Место ошибки в исходнике не показывается.
Прога сглючивает при наростании кол-ва паралельных потоков (при их кол-ве около 10).
Хотя это обычная дебаг-версия с отладочной инфой.



Ну и с чего это ты взял что new виноват, а?

1.0K
16 февраля 2006 года
diesel_den
169 / / 22.12.2005
Ну или от такой стэк вызова:
ntdll.dll!7c91b3fb()
ntdll.dll!7c90ef36()
2.4K
16 февраля 2006 года
dinasok51
219 / / 12.11.2005
Цитата:
Originally posted by diesel_den
Ну или от такой стэк вызова:
ntdll.dll!7c91b3fb()
ntdll.dll!7c90ef36()


Это не информативно


Закатай всю свою прогр. в try - catch( ... )
затем распечатай что дадут в саtch GetLastError() GetExceptionCode() и выложи здесь то что распечатал
А там посмотрим.

398
16 февраля 2006 года
Alexandoros
630 / / 21.10.2005
Ух ты жесткий пацан. Ты что ж не можеш локализировать проблему? С дебугером не дружиш? Перегрузи new и delete. Веди подсчет сколько ты выделил, а сколько освободил. А ты delete хоть явно вызываеш?

Цитата:
Перегрузил new и delete


Так и что ты выяснил? Сколько байт выделяеш и сколько освобождаеш?

1.0K
17 февраля 2006 года
diesel_den
169 / / 22.12.2005
Цитата:
Originally posted by Alexandoros
Так и что ты выяснил? Сколько байт выделяеш и сколько освобождаеш?


1) А как я в delete узнаю, скока я байт освобождаю, если передаётся в него токо указатель?
2) Вопрос на засыпку:
Если вызвать delete от недействительного указателя, память испортится ????
То есть возможны ли после этого сбои ????
Короче вроде в этом причина сбоев моей проги (насчёт new).
Я перегрузил пустым оператором оператор delete и вроде глюки исчезли полностью. Конечно это временно, чисто для теста данной теории.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог