Второй printf напечатает мусор.tiasur писал(а):Tут помимо всеобшей тупизны ничего особенного не замечаю. Ну разве что memory leakage.
Что тут неправильного?
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
- sz
- Маньяк
- Сообщения: 1266
- Зарегистрирован: 17 фев 2003, 19:34
- aissp
- Маньяк
- Сообщения: 2710
- Зарегистрирован: 07 ноя 2005, 09:51
-
- Маньяк
- Сообщения: 1510
- Зарегистрирован: 26 фев 2006, 10:00
- Откуда: offline
- aissp
- Маньяк
- Сообщения: 2710
- Зарегистрирован: 07 ноя 2005, 09:51
Конещно правильно потому как строчка new int(n) ето создание нового инта и присваивание ему n а вот первый цикл убьет все к черту потому как память выделена не под массив а под один инт
Во как интересно оказывается. Когда в цикле до 10 мы приравниваем 0, мы зануляем часть хипа в том числе и там где находится конец хипа указателя, поетому при второй инициализации хип у нас уже разрушен нашими мудрыми действиями и программа просто крашится на етом месте. Спасибо за задачу=)
Во как интересно оказывается. Когда в цикле до 10 мы приравниваем 0, мы зануляем часть хипа в том числе и там где находится конец хипа указателя, поетому при второй инициализации хип у нас уже разрушен нашими мудрыми действиями и программа просто крашится на етом месте. Спасибо за задачу=)
-
- Маньяк
- Сообщения: 1510
- Зарегистрирован: 26 фев 2006, 10:00
- Откуда: offline
Функция array(int n) вызывается два раза, следовательно памяти выделяется под два инта. Цикл вообше опасен тем, что пошел обнулять память неизвестно кому принадлежащию. Плюспроблема с утечкой памяти так как при вызове функции array(int n) во второй раз теряем указатель на первый выделенный инт. Еше нигде не используется delete.aissp писал(а): Во как интересно оказывается. Когда в цикле до 10 мы приравниваем 0, мы зануляем часть хипа в том числе и там где находится конец хипа указателя, поетому при второй инициализации хип у нас уже разрушен нашими мудрыми действиями и программа просто крашится на етом месте. Спасибо за задачу=)
Ничего не крашится, все работает. Но тупизна просто убивает.
- aissp
- Маньяк
- Сообщения: 2710
- Зарегистрирован: 07 ноя 2005, 09:51
Данное утверждение - ничегоне крешится, сильно зависит от способа реализации хипа. Например, я могу организовать его так, что в следущую ячейку я заложу адрес следующего свободного блока, тогда следуюший свободный блок при вызове new будет = 0, и программа упадет.
Я в том смысле что цикл тут так же опасен как и потеря выделенной памяти
Я в том смысле что цикл тут так же опасен как и потеря выделенной памяти

- ajkj3em
- Маньяк
- Сообщения: 2063
- Зарегистрирован: 12 ноя 2006, 06:53
если я правильно помню, то по стандарту new failure вызывает throw std::bad_allocaissp писал(а):Ну как же
ptr = nrew int; //we havent resources so right now new return 0 (or some garbage and bad_alloc)
//if we got bad_alloc we get cored dump immediately in opposite case the next string is
*(0) = n; //with the same result
- ajkj3em
- Маньяк
- Сообщения: 2063
- Зарегистрирован: 12 ноя 2006, 06:53
- ajkj3em
- Маньяк
- Сообщения: 2063
- Зарегистрирован: 12 ноя 2006, 06:53
какие-то идиотские задачки, ей богу :)
как метко заметил зотин в своем эпохальном эссе про программстов,
"вот тут видно, что человек выучил reference counters, а тут выучил .."
здесь тоже самое - кто-то налетел на тривиальные грабли и решил
что все остальные примерно такие же оболтусы и это стоит спрашивать
на интервью ...
-- edit -- чтобы добавить конструктивизма в пост :) --
как метко заметил зотин в своем эпохальном эссе про программстов,
"вот тут видно, что человек выучил reference counters, а тут выучил .."
здесь тоже самое - кто-то налетел на тривиальные грабли и решил
что все остальные примерно такие же оболтусы и это стоит спрашивать
на интервью ...
-- edit -- чтобы добавить конструктивизма в пост :) --
header1.h писал(а): #ifndef _HEADER_1_
#define _HEADER_1_
int x;
#endif
header2.h писал(а): #ifndef _HEADER_2_
#define _HEADER_2_
int x;
#endif
спрашивается - почему этот код компилируется и линкуется OK ?main.c писал(а): #include "header1.h"
#include "header2.h"
int main(int argc, char ** argv)
{
x = 0;
return 0;
}
-
- Маньяк
- Сообщения: 2841
- Зарегистрирован: 20 фев 2003, 09:15
- Откуда: Vancouver
- ajkj3em
- Маньяк
- Сообщения: 2063
- Зарегистрирован: 12 ноя 2006, 06:53
- aissp
- Маньяк
- Сообщения: 2710
- Зарегистрирован: 07 ноя 2005, 09:51
Я так понимайт, что речь идет о языке С? Потому как с С++ такой трюк не проходит. В С директивы процессора не причем как я понимаю, и второя объявление int x полностью скрывает первое. Ай типа гуэсс =)
что касается new:
void* operator new(size_t) throw(bad_alloc)
void* operator new(size_t, const nothrow_t&) throw()
void* operator new(size_t, void* p) throw()
то бишь версия оператора new с размещением в известном буфере (стр 3) не генерит исключений (она просто возвращает укащатель на буффер) и версия типа
MyQQ *qq = new(nothrow) MyQQ(qqq) ;
вернеть 0 если память ен выделиться.
Такие дела
что касается new:
void* operator new(size_t) throw(bad_alloc)
void* operator new(size_t, const nothrow_t&) throw()
void* operator new(size_t, void* p) throw()
то бишь версия оператора new с размещением в известном буфере (стр 3) не генерит исключений (она просто возвращает укащатель на буффер) и версия типа
MyQQ *qq = new(nothrow) MyQQ(qqq) ;
вернеть 0 если память ен выделиться.
Такие дела
- Marmot
- Графоман
- Сообщения: 39279
- Зарегистрирован: 17 фев 2003, 17:58
- Откуда: Caulfeild
- Контактная информация:
- aissp
- Маньяк
- Сообщения: 2710
- Зарегистрирован: 07 ноя 2005, 09:51
Не согласный я. Если ты могешь человека послать 100-мя разными способами, ето гораздо лучше если иметь тока один способ, потому как окромя конкретного адреса, можно так сказать полностью специфицировать маршрут похода и даже добавить свое личностное отношение к нему.
Программис ето прежде всего писатель (имхо), и чем выразительнее у него средство тем легче ему работать, ну при наличии мозгов конечно (про мозги я ето не в обиду ява программистам а так по жизни не скажу что я в сях как свинья в апельсинах=) )
От такой мое сугубое имхо
Программис ето прежде всего писатель (имхо), и чем выразительнее у него средство тем легче ему работать, ну при наличии мозгов конечно (про мозги я ето не в обиду ява программистам а так по жизни не скажу что я в сях как свинья в апельсинах=) )
От такой мое сугубое имхо
- ajkj3em
- Маньяк
- Сообщения: 2063
- Зарегистрирован: 12 ноя 2006, 06:53
C indeed. ответ не правильныйaissp писал(а):Я так понимайт, что речь идет о языке С? Потому как с С++ такой трюк не проходит. В С директивы процессора не причем как я понимаю, и второя объявление int x полностью скрывает первое. Ай типа гуэсс =)

ну так и где собственно placement new call в оригинальном примере ?что касается new:
void* operator new(size_t) throw(bad_alloc)
void* operator new(size_t, const nothrow_t&) throw()
void* operator new(size_t, void* p) throw()
то бишь версия оператора new с размещением в известном буфере (стр 3) не генерит исключений (она просто возвращает укащатель на буффер) и версия типа
MyQQ *qq = new(nothrow) MyQQ(qqq) ;
вернеть 0 если память ен выделиться.
Такие дела