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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> new возвращает NULL, какие предположения? 
V
    Опции темы
Earnest
Дата 31.1.2006, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Почитай в MSDN насчет HeapAlloc. Она может возвращать 0 в двух случаях: если нет памяти, или если хип поврежден. Полагаю, дело во-втором.
Как я поняла, один и тот же код (ParseCreationXMLFile) у тебя то работает, то нет, в зависимости от того, по какой ветви идет выполнение? Так проверь как следует ветку, в которой рушится. Посмотри функции HeapValidate, HeapQueryInformation, HeapWalk.


--------------------
...
PM   Вверх
Fixin
Дата 31.1.2006, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



А может скобки убрать при объявлении?
Код

bool TRegistrator::ParseCreationXMLFile(const char *szFileName)    
{    
  CXMLRead *lpXML = new CXMLRead;
...    
}

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


Эксперт
****


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

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



Скобки там, конечно, не нужны, но вряд ли это они производят такой разрушительный эффект на хип smile


--------------------
...
PM   Вверх
Fixin
Дата 31.1.2006, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



А хто знает? шестая ведь...
PM MAIL ICQ   Вверх
maxim1000
Дата 31.1.2006, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



многопоточность используется?


--------------------
qqq
PM WWW   Вверх
bel_nikita
Дата 31.1.2006, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Цитата(Earnest @ 31.1.2006, 18:59)
Она может возвращать 0 в двух случаях: если нет памяти, или если хип поврежден. Полагаю, дело во-втором.

Вот, и я так думаю. Но отыскать, где разрушаю, уже неделю не могу. Все работает замечательно имеено до момента указанного выделения.

Цитата(maxim1000 @ 31.1.2006, 20:42)
многопоточность используется?

Да, используется. до 15 потоков.



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
dronzo
Дата 31.1.2006, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



bel_nikita, Здесь обсуждается похожая проблема. Я честно пытался понять до конца, так как самому интересно стало, но ... smile Быть может, так как ты занимаешься своей проблемой уже определённое время, то приведённые советы будут яснее :
http://groups.google.ru/group/microsoft.pu...892c08b35aac700
PM MAIL   Вверх
chipset
Дата 31.1.2006, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

bool TRegistrator::ParseCreationXMLFile(const char *szFileName)
{


try {  CXMLRead *lpXML = reinterpret_cast<CXMLRead*> (HeapAlloc(GetProcessHeap(),HEAP_GENERATE_EXCEPTIONS,sizeof(CXMLRead))); // /
{ catch (STATUS_NO_MEMORY)
{
//отрепорть как-нить
{
}

Добавлено @ 22:39
Попробуй, что бы было ясно что дело не в outofmemory.
Добавлено @ 22:40
А класс CXMLRead самописный? Может трабла в его конструкторе?



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


Эксперт
****


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

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



Цитата(bel_nikita @ 31.1.2006, 20:52 Найти цитируемый пост)

Да, используется. до 15 потоков

у HeapCreate есть один флажок: HEAP_NO_SERIALIZE
возможно, по каким-то причинам он устанавливается
правда, не знаю, как это проверить - никогда не сталкивался с необходимостью узнать параметры кучи
если все-таки это так (может, где-то по умолчанию стояло однопоточное приложение), то я вижу три варианта:
1. для каждого потока сделать свою кучу (ну мало ли)
2. найти способ убрать флаг HEAP_NO_SERIALIZE, еслине ошибаюсь, этим занимается CRT...
3. использовать HeapLock и HeapUnlock



--------------------
qqq
PM WWW   Вверх
Earnest
Дата 1.2.2006, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(bel_nikita @ 31.1.2006, 21:52 Найти цитируемый пост)

Вот, и я так думаю. Но отыскать, где разрушаю, уже неделю не могу.

Попробуй HeapValidate. Во-первых, вызови его перез самым new. Если он скажет, что хип порушен, начинай искать, где, с помощью тех же вызовов HeapValidate.

Потоки могут вызвать взаимоблокировку при распределении памяти, с таким сталкивалась, но чтобы порчу кучи... Я думаю, это какой-нибудь тупой баг, типа записи по живому...



--------------------
...
PM   Вверх
bel_nikita
Дата 9.2.2006, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Никак не удается найти smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Hroft
Дата 9.2.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А если прямо перед этой строчкой написать какое-нибудь банальное
Код

        int* iii = new int;
        *iii = 4;
        int ii = *ii;

оно будет работать? Мне тоже кажется, что проблема в конструкторе. Даже если не самописный, не боги горшки обжигают.
PM MAIL ICQ   Вверх
bel_nikita
Дата 9.2.2006, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Вот, такой дефайн пробывал вставлять, чтоб отловить куски, где хип "бью".
Код
#define ASSERT_NEW_OK  { char* __p = new CHAR[6400]; if ( __p == NULL ){ __asm { int 3 }; } else delete __p; }

Но сейчас "покапался" в линкере и нашел переменную stack. Увеличил до 32768 и ... Ура! Работает!... Вроде smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Hroft
Дата 9.2.2006, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У тебя там что, рекурсивные вызовы есть, что стека не хватает? Или такие прикольные локальные переменные?
Интересно, а stack общий для всех потоков, или каждому свой?
PM MAIL ICQ   Вверх
Lotrex
Дата 10.2.2006, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 9.2.2006
Где: Казань

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



Цитата

Цитата(threef @  31.1.2006,  19:54 Найти цитируемый пост)

Возвращать NULL- это фича new.

это вовсе не фича new, это фича new(nothrow).
Стандарт 2003. Параграф 5.3.4. Пункт 13.
Цитата

[Note: unless an allocation function is declared with an empty exception-specification (15.4), throw(), it
indicates failure to allocate storage by throwing a bad_alloc
exception (clause 15, 18.4.2.1); it returns a
non-null pointer otherwise
. If the allocation function is declared with an empty exception-specification,
throw(), it returns null to indicate failure to allocate storage and a non-null pointer otherwise. ] If the
allocation function returns null, initialization shall not be done, the deallocation function shall not be called,
and the value of the new-expression shall be null.

Иными словами - обычный new либо возвращает не null, либо кидает исключение.


А мне бы как раз такой необычный new не помешал. Из приведенной цитаты стандарта понятно, что вроде можно это сделать, но не понятно, как... Мож, подскажете?
PM MAIL ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0581 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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