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

Поиск:

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


Эксперт
****


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

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



MSVC 6 SP6/ PharLap

Такая засада: оператор new возвращает NULL smile Чтобы это могло быть?
До конструктора не доходит, HeapAlloc выдает NULL
Интересно то, что, если прога идет по другой ветке, то все ок.


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


uploading...
****


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

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



интересно smile

насчет HeapAlloc -а это debug-ом выяснялось или пробовал сам HeapAlloc вызывать???

можно задать параметр HEAP_GENERATE_EXCEPTIONS, и посмотреть...вместо возвращения NULL он выдаст exception...

PM   Вверх
threef
Дата 30.1.2006, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

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



Код

struct null{
    bool s;
};
main()
{
    int x=5,y=7;    
    x==y? x++ :
    ( x>y ? x++: *(&y-1)=-1),y++;
    null *z = new null[x];
    cout<<z<<'\n';
}



Может, немного кода ?
Ну очень трудно догадаться. Здесь new тоже NULL

Это сообщение отредактировал(а) threef - 30.1.2006, 18:51
PM MAIL   Вверх
DeadSoul
Дата 31.1.2006, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(bel_nikita @ 30.1.2006, 17:58 Найти цитируемый пост)

Чтобы это могло быть?

Более 4-х лет боевого опыта. Не бывает такого
Добавлено @ 00:57
bel_nikita, а ты не массив пытаешься создать?
Код

A* pA=new A[mySize];// а mySize меньше нуля....



--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
bel_nikita
Дата 31.1.2006, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(DeadSoul @ 30.1.2006, 23:47)
Более 4-х лет боевого опыта. Не бывает такого

Бывает оказывается smile возвращает нуль smile У меня, как-то был похожий трабл, реально памяти нехватало, но тут свободной 250 МБ. Но самое непонятное, то что по одной ветке программы все работает, по-другой нет.
А код совершенно безобидный:
Код

...
CObject* pObject = new CObject();
...



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


Эксперт
***


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

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



Минимальный код воспроизодящий ошибку сделать нереально насколько я понимаю.

operator new переопределен?

Попробуй полный ребилд, может дебугер нсовсем то отображает


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
JackYF
Дата 31.1.2006, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


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

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



А какое вообще право имеет new возвращать NULL???

Если я не ошибаюсь, по стандарту он ОБЯЗАН вызывать исключение. Или я чего-то недопонял?

Насчет самой проблемы - не бывало.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
bel_nikita
Дата 31.1.2006, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(JackYF @ 31.1.2006, 02:03)
А какое вообще право имеет new возвращать NULL???

Если я не ошибаюсь, по стандарту он ОБЯЗАН вызывать исключение. Или я чего-то недопонял?

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


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


^аВаТаР^ сообщение>>
****


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

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



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

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

Как насчёт того, чтобы переопределить new самому таким образом, чтобы он кидал исключения?


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
threef
Дата 31.1.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

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



new...
Цитата


bel_nikita

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



Возвращать NULL- это фича new.
Честно говоря, если у тебя new для CObject не переопределен, то неясно, как он возвращает NULL. У меня не получилось smile
PM MAIL   Вверх
Mayk
Дата 31.1.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Цитата(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, либо кидает исключение.

Это сообщение отредактировал(а) Mayk - 31.1.2006, 16:50


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Romikgy
Дата 31.1.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Где то читал , что это настраивается компилятором, что делать, или нулл возвращать или исключение кидать.


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

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


Эксперт
****


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

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



Стандарт - это, конечно, хорошо, но не в идеальном мире живем...
Насколько я помню, в 6й студии была такая опция - NULL возвращать или исключение кидать.
Вот как и где она включается - не помню - то ли что-то вызвать надо, то ли просто опция в проекте или слово волшебное для препроцессора... Короче, попробуй поискать в MSDN (именно том, что для этой студии) по словам new, set_new_handler и т.д. (просто чтобы понять - что же у тебя включено).

Тем не менее, очень странно, что возвращает NULL (не 256 mb твой объект ведь)... Попробуй сходить внутрь отладчиком.

Кажется, new может вернуть NULL, если просят 0 байтов... Чудно, конечно, но надо бы проверить, чего там в той ветке компилятор накомпилировал...


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

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



Цитата
Интересно то, что, если прога идет по другой ветке, то все ок.

Цитата
Но самое непонятное, то что по одной ветке программы все работает, по-другой нет.

Что за ветки ты имеешь ввиду?


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
bel_nikita
Дата 31.1.2006, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Сваливается событие в глобальную очередь, потом парсится:
Код
BOOL cTestManager::ProcessMessage(Message timMsg)
{
...
case CREATE:
          InitTDispatcher();
break;
...
}

Происходит инициализация диспетчера:
Код
BOOL InitTDispatcher(int iPar = -1)
{
...
    TRegistrator::Instance()->ParseCreationXMLFile("module.xml");
...
}

А вот, соббственно и проблемная "зона":
Код

bool TRegistrator::ParseCreationXMLFile(const char *szFileName)
{
  CXMLRead *lpXML = new CXMLRead(); // Вот, тут я получаю  NULL
...
}

Покопался в дебаге. NULL вылает метод HeapAlloc.

Это сообщение отредактировал(а) bel_nikita - 31.1.2006, 18:44


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW 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.0701 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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