Что тут неправильного?

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
Аватара пользователя
sz
Маньяк
Сообщения: 1266
Зарегистрирован: 17 фев 2003, 19:34

Сообщение sz »

tiasur писал(а):Tут помимо всеобшей тупизны ничего особенного не замечаю. Ну разве что memory leakage.
Второй printf напечатает мусор.
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

Старина читаем внимательнее и тщятельнее, я в дятельстве признался и раскаялся. Не то пожалуюсь можератору за необоснованные наезды.
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Сообщение tiasur »

Да нет все правильно там печатает, 10.
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

Конещно правильно потому как строчка new int(n) ето создание нового инта и присваивание ему n а вот первый цикл убьет все к черту потому как память выделена не под массив а под один инт

Во как интересно оказывается. Когда в цикле до 10 мы приравниваем 0, мы зануляем часть хипа в том числе и там где находится конец хипа указателя, поетому при второй инициализации хип у нас уже разрушен нашими мудрыми действиями и программа просто крашится на етом месте. Спасибо за задачу=)
tiasur
Маньяк
Сообщения: 1510
Зарегистрирован: 26 фев 2006, 10:00
Откуда: offline

Сообщение tiasur »

aissp писал(а): Во как интересно оказывается. Когда в цикле до 10 мы приравниваем 0, мы зануляем часть хипа в том числе и там где находится конец хипа указателя, поетому при второй инициализации хип у нас уже разрушен нашими мудрыми действиями и программа просто крашится на етом месте. Спасибо за задачу=)
Функция array(int n) вызывается два раза, следовательно памяти выделяется под два инта. Цикл вообше опасен тем, что пошел обнулять память неизвестно кому принадлежащию. Плюспроблема с утечкой памяти так как при вызове функции array(int n) во второй раз теряем указатель на первый выделенный инт. Еше нигде не используется delete.

Ничего не крашится, все работает. Но тупизна просто убивает.
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

Данное утверждение - ничегоне крешится, сильно зависит от способа реализации хипа. Например, я могу организовать его так, что в следущую ячейку я заложу адрес следующего свободного блока, тогда следуюший свободный блок при вызове new будет = 0, и программа упадет.

Я в том смысле что цикл тут так же опасен как и потеря выделенной памяти :)
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

aissp писал(а):Ну как же

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
если я правильно помню, то по стандарту new failure вызывает throw std::bad_alloc
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

Старина Зотин писал(а):
aissp писал(а):Вообще то 0 там будут, благо инт (вот могу соврать но вроде еще помнб стандарт) обязан проинициализироваться нулем.
Обязан только для глобальных данных. На стеке никто никому ничего не обязан.
для статических по-моему. не для глобальных.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

какие-то идиотские задачки, ей богу :)

как метко заметил зотин в своем эпохальном эссе про программстов,
"вот тут видно, что человек выучил 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
main.c писал(а): #include "header1.h"
#include "header2.h"

int main(int argc, char ** argv)
{
x = 0;
return 0;
}
спрашивается - почему этот код компилируется и линкуется OK ?
Vovchik
Маньяк
Сообщения: 2841
Зарегистрирован: 20 фев 2003, 09:15
Откуда: Vancouver

Сообщение Vovchik »

ajkj2em писал(а): как метко заметил зотин в своем эпохальном эссе про программстов,
"вот тут видно, что человек выучил reference counters, а тут выучил .."


Че то я вот не помню такого эссе. Нельзя типа ссылочку чтоб почитать?
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

Vovchik писал(а): Че то я вот не помню такого эссе. Нельзя типа ссылочку чтоб почитать?
хмм ... сори, этот тезис обсуждался в прайват порядке ...
это я с прямым углом спутал :)
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

Я так понимайт, что речь идет о языке С? Потому как с С++ такой трюк не проходит. В С директивы процессора не причем как я понимаю, и второя объявление 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 если память ен выделиться.

Такие дела
Аватара пользователя
Marmot
Графоман
Сообщения: 39279
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Сообщение Marmot »

Почитал я вас ребята, почитал, и решил, что не зря я в своё время так Java полюбил.
Уже в который раз вижу как C/C++ народ такого типа задачки с пеной у рта обсуждает.
И солидные вроде люди, и не дураки...
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

Не согласный я. Если ты могешь человека послать 100-мя разными способами, ето гораздо лучше если иметь тока один способ, потому как окромя конкретного адреса, можно так сказать полностью специфицировать маршрут похода и даже добавить свое личностное отношение к нему.

Программис ето прежде всего писатель (имхо), и чем выразительнее у него средство тем легче ему работать, ну при наличии мозгов конечно (про мозги я ето не в обиду ява программистам а так по жизни не скажу что я в сях как свинья в апельсинах=) )

От такой мое сугубое имхо
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

aissp писал(а):Я так понимайт, что речь идет о языке С? Потому как с С++ такой трюк не проходит. В С директивы процессора не причем как я понимаю, и второя объявление int x полностью скрывает первое. Ай типа гуэсс =)
C indeed. ответ не правильный :)
что касается 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 если память ен выделиться.

Такие дела
ну так и где собственно placement new call в оригинальном примере ?
Ответить