утечек памяти нет, а New выбрасывает Exception-ы после долгой работы. почему ?
Что бы это могло быть? Какие операции впринципе могут приводить к краху ТАКИХ ВАЖНЫХ системных функций ? Это же, например, не попытка обращения к памяти, которая потерпит крах при недопустимом адресе. Я же только говорю, что мне нужно немножко памяти, которой у системы ещё прудь пруди. С чего бы это вдруг система не можут выделить немножко (байт 100) памяти ?
Видать память засорил. Приведи код.
Видать память засорил. Приведи код.
1) Код огромен, не представляется возможным его привести. Дело в том, что new вызывается во многих местах, а exception выдаёт в любом из них, так что возникает вопрос, может ли это вообще быть ошибка в моём коде.
2) Как это засорил память, если я специально смотрю разными прогами, скока эта прога занимает памяти и вижу, что утечек памяти нет. Я недавно устранил утечку памяти.
1) Код огромен, не представляется возможным его привести. Дело в том, что new вызывается во многих местах, а exception выдаёт в любом из них, так что возникает вопрос, может ли это вообще быть ошибка в моём коде.
2) Как это засорил память, если я специально смотрю разными прогами, скока эта прога занимает памяти и вижу, что утечек памяти нет. Я недавно устранил утечку памяти.
можт у тя нет свободного куска памяти подходящего размера ? вовсяком случае рекомендую посмотреть содержимое Exception. В первом же случае почитай Александреску у него там есть про распределение памяти для небольших объектов. Книгу можно скачать на одной из ссылок самой первой темы этого форума. А также рекомендую глобально пересмотреть код с целью выявления случаев когда нужно и можно обойтись без new. То бишь без выделения памяти из кучи.
Что бы это могло быть? Какие операции впринципе могут приводить к краху ТАКИХ ВАЖНЫХ системных функций ? Это же, например, не попытка обращения к памяти, которая потерпит крах при недопустимом адресе. Я же только говорю, что мне нужно немножко памяти, которой у системы ещё прудь пруди. С чего бы это вдруг система не можут выделить немножко (байт 100) памяти ?
Выложи здесь сообщение об ошибке
и фрагмент кода, кот соотв. этой ошибке.
можт у тя нет свободного куска памяти подходящего размера ? вовсяком случае рекомендую посмотреть содержимое Exception. В первом же случае почитай Александреску у него там есть про распределение памяти для небольших объектов. Книгу можно скачать на одной из ссылок самой первой темы этого форума. А также рекомендую глобально пересмотреть код с целью выявления случаев когда нужно и можно обойтись без new. То бишь без выделения памяти из кучи.
Попробуй вместо new/delete использовать malloc/free
Попробуй вместо new/delete использовать malloc/free
Конкурс нелепых советов?
Конкурс нелепых советов?
:D
Я тоже дам совет. Наверное, память сгорела...не до конца.
try catch юзаеш? Ексепшн может еще быть при обращении к невалидному указателю, использовании delete [] вместо delete и т.д. Какие ексепшены нью кидает? Перегрузи нью и делете и считай скока байт выделяеш / освобождаеш. Запрашивай размер свободной кучи перед выделением, наконец.
Как раз в try-catch я завернул каждую операцию new. И exception выскакивает не в конкретному участке кода, а в любом из этих try-catch.
> Какие ексепшены нью кидает? - не знаю, я юзаю catch(...) :(
> Запрашивай размер свободной кучи перед выделением, наконец. - А вот тут пожалуйста поподробней :) ...
Что бы это могло быть? Какие операции впринципе могут приводить к краху ТАКИХ ВАЖНЫХ системных функций ? Это же, например, не попытка обращения к памяти, которая потерпит крах при недопустимом адресе. Я же только говорю, что мне нужно немножко памяти, которой у системы ещё прудь пруди. С чего бы это вдруг система не можут выделить немножко (байт 100) памяти ?
А точно при new?
Какой объект создаешь? Что у него в конструкторе?
А точно при new?
Какой объект создаешь? Что у него в конструкторе?
Точно. Я выделяю память под запись размером до 100 байт :)
Мне бы действительно как-то узнать скоко в этот момент мне динамической памяти доступно...
Точно. Я выделяю память под запись размером до 100 байт :)
Мне бы действительно как-то узнать скоко в этот момент мне динамической памяти доступно...
Что значит "выделяю память под запись"?
new с точки зрения ООП не выделяет память как таковую, а создает объект.
Ты создаешь объект типа char[100] ?
Ты думаешь, что твоя программа вылезла за рамки в 2Гб?
Что-то сомневаюсь...
P.S. Телепаты все в отпуске, без кода нам тяжело что-либо говорить.
Как раз в try-catch я завернул каждую операцию new. И exception выскакивает не в конкретному участке кода, а в любом из этих try-catch.
> Какие ексепшены нью кидает? - не знаю, я юзаю catch(...) :(
> Запрашивай размер свободной кучи перед выделением, наконец. - А вот тут пожалуйста поподробней :) ...
Выложи текстом: что у тебя твой catch( ... ) выловил и что этот try{} такого выдающегося содержит
Или это военные тайны?
ты не поверяешь на NULL значение, возвращенное new(), и пытаешься обратиться к памяти, кот не выделена.
С известным эффектом.
> Запрашивай размер свободной кучи перед выделением, наконец. - А вот тут пожалуйста поподробней :) ...
Только теоретически. new юзает память выделяемую из хипа через HeapAlloc. Значит инфа полученая через HeapWalk должна быть правильной :) Вот и попробуй заюзать HeapWalk.
Хотя скорее всего проще подсчитать колво выделяемых байт, путем перегрузки new. Если колво байт доходит до предела физичиская память + размер подкачки, значит ликимемори.
Ты создаешь объект типа char[100] ?
Ты думаешь, что твоя программа вылезла за рамки в 2Гб?
Что-то сомневаюсь...
Это операция производиться многократно. По нормально эта память вскоре должна освобождаться оператором delete, что и происходит судя по Пуск/Программы/Администрирование/Производительность.
Я не дурак, просто сервера на сокетах пишу с недавнего сремени.
Могу предположить следующее:
ты не поверяешь на NULL значение, возвращенное new(), и пытаешься обратиться к памяти, кот не выделена.
С известным эффектом.
exception выбрасывает сама операция new, код далее не выполняется.
Только теоретически. new юзает память выделяемую из хипа через HeapAlloc. Значит инфа полученая через HeapWalk должна быть правильной :) Вот и попробуй заюзать HeapWalk.
Хотя скорее всего проще подсчитать колво выделяемых байт, путем перегрузки new. Если колво байт доходит до предела физичиская память + размер подкачки, значит ликимемори.
Ну до "физичиская память + размер подкачки" тут далековато будет, но вот за HeapWalk спасибо (правда ещё не разбирался, что это такое вообще).
:D
Я тоже дам совет. Наверное, память сгорела...не до конца.
Наверно материнка у него не от Intel ... :))))
exception выбрасывает сама операция new, код далее не выполняется.
посмотри в выбрасоевом exception объекте наверно должно быть сообщение с причинами ошибками или код ошибки... не мучай людей.
Это операция производиться многократно. По нормально эта память вскоре должна освобождаться оператором delete, что и происходит судя по Пуск/Программы/Администрирование/Производительность.
Я не дурак, просто сервера на сокетах пишу с недавнего сремени.
Для new char[100] должен быть delete[], а не просто delete.
exception выбрасывает сама операция new, код далее не выполняется.
Судя по документации, new может метнуть лишь один эксепшн: bad_alloc. Наверное, имеет смысл поставить обработчик new с помощью set_new_handler, и там глянуть ситуацию с памятью и, если надо, улучшить её, т.к. не надо забывать, что размер максимально допустимой с помощью new памяти ограничен не цифрой "физичиская память + размер подкачки", а размером heap'а для данного приложения
Для new char[100] должен быть delete[], а не просто delete.
Какая разница для него это просто блок памяти ... не будет же оно деструктор для каждого char вызывать... да и нет у char деструктора... скорее всего тут просто полная фрагментация памяти ...
допустим допустимый размер кучи - 100 байт. И эти 100 байт распределены следующим образом:
00 - 29 Свободно ( 30 байт )
30 - 79 Занято ( 50 байт )
80 - 99 Свободно ( 20 байт )
Таким образом имеем ситуацию : утечек памяти нет, свободной памяти - 50 байт, но выделить программа может только 20 или 30 байт. Поэтому если запрашиваем 40 байт нас посылают....
фрагментация памяти :
допустим допустимый размер кучи - 100 байт. И эти 100 байт распределены следующим образом:
00 - 29 Свободно ( 30 байт )
30 - 79 Занято ( 50 байт )
80 - 99 Свободно ( 20 байт )
Таким образом имеем ситуацию : утечек памяти нет, свободной памяти - 50 байт, но выделить программа может только 20 или 30 байт. Поэтому если запрашиваем 40 байт нас посылают....
Подобную фрагментацию можно попробовать исправить с помощью HeapCompact(GetProcessHeap(), HEAP_NO_SERIALIZE). К тому же, возвращаемое ей значение укажет максимально возможный размер блока для выделения
Подобную фрагментацию можно попробовать исправить с помощью HeapCompact(GetProcessHeap(), HEAP_NO_SERIALIZE). К тому же, возвращаемое ей значение укажет максимально возможный размер блока для выделения
Ну подобную ситуацию она(HeapCompact) не исправит, а вот с помощью нее проверить максимально возможный размер блока для выдления перед вызовом new посоветовать автору темы можно и нужно.
Ну подобную ситуацию она(HeapCompact) не исправит, а вот с помощью нее проверить максимально возможный размер блока для выдления перед вызовом new посоветовать автору темы можно и нужно.
А вообще причину возникновения исключения можно узнать, заменив new на HeapAlloc() с флагом HEAP_GENERATE_EXCEPTIONS. Если память выделена не будет, вариантов исключений будет всего два: STATUS_NO_MEMORY и STATUS_ACCESS_VIOLATION (повреждение heap'а). По крайней мере, это значительно упростит процесс отыскание жука
Прога полностью глючить не перестала, но вроде как вероятность exception-а упала процентов на 95.
Хотя компилю я с опцией /MT !!!
Может эта опция не производит синхронизация new и delete, которую она должна обеспечивать?
Перегрузил new и delete и поставил синхронизацию.
Прога полностью глючить не перестала, но вроде как вероятность exception-а упала процентов на 95.
Хотя компилю я с опцией /MT !!!
Может эта опция не производит синхронизация new и delete, которую она должна обеспечивать?
шизуха косит наши ряды......
Наверно материнка у него не от Intel ... :))))
аффтар зачот :D :D :D
А вообще причину возникновения исключения можно узнать, заменив new на HeapAlloc() с флагом HEAP_GENERATE_EXCEPTIONS. Если память выделена не будет, вариантов исключений будет всего два: STATUS_NO_MEMORY и STATUS_ACCESS_VIOLATION (повреждение heap'а). По крайней мере, это значительно упростит процесс отыскание жука
Чё-то у меня не выходит try/cartch откомпилить. Что тут не так?
p = HeapAlloc(hHeap, HEAP_GENERATE_EXCEPTIONS, size); }
catch (STATUS_NO_MEMORY)
{Log("STATUS_NO_MEMORY", 3); }
Ругается на скобку перед STATUS_NO_MEMORY.
{
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 !!!
Стэк вызова:
ntdll.dll!7c901230()
ntdll.dll!7c96c943()
ntdll.dll!7c949eb9()
Место ошибки в исходнике не показывается.
Хотя это обычная дебаг-версия с отладочной инфой.
{
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).
Хотя это обычная дебаг-версия с отладочной инфой.
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 виноват, а?
ntdll.dll!7c91b3fb()
ntdll.dll!7c90ef36()
Ну или от такой стэк вызова:
ntdll.dll!7c91b3fb()
ntdll.dll!7c90ef36()
Это не информативно
Закатай всю свою прогр. в try - catch( ... )
затем распечатай что дадут в саtch GetLastError() GetExceptionCode() и выложи здесь то что распечатал
А там посмотрим.
Так и что ты выяснил? Сколько байт выделяеш и сколько освобождаеш?
Так и что ты выяснил? Сколько байт выделяеш и сколько освобождаеш?
1) А как я в delete узнаю, скока я байт освобождаю, если передаётся в него токо указатель?
2) Вопрос на засыпку:
Если вызвать delete от недействительного указателя, память испортится ????
То есть возможны ли после этого сбои ????
Короче вроде в этом причина сбоев моей проги (насчёт new).
Я перегрузил пустым оператором оператор delete и вроде глюки исчезли полностью. Конечно это временно, чисто для теста данной теории.