1. C++ / Говнокод #1747

    +57.4

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    volatile void* AllocatedMemory;
    
    int AllocateMemoryThread(const int size)
    {
    	char buffer[size];
    	AllocatedMemory=(void*)buffer;
    	AllocatingDone.Signal();
    	Sleep(INFINITY);
    	return 0;
    };
    
    ...
    
    void* MAlloc(const int size)
    {
    	CriticalSection.Lock();
    	if( !CreateThread(AllocateMemoryThread,true,size,0) )
    		return NULL;
    	AllocatingDone.Wait();
    	const void* AllocatedBuffer=AllocatedMemory;
    	CriticalSection.UnLock();
    	return AllocatedBuffer;
    };

    CriticalSection - критическая секция.
    AllocatingDone - какой-то семафор.
    Вообще не могу понять код. Что он этим хотел сказать...

    Запостил: Говногость, 02 Сентября 2009

    Комментарии (22) RSS

    • Ну тут такой хитрый план выделения памяти у чела. Создать в стеке процедуры буфер и вернуть на него указатель.
      Ну а чтобы буфер не смысло надо повесить процедуру. Просто охуенно.
      Ответить
      • Не такой сдесь план. Для каждого выделения памяти создаём поток. В стеке этого потока выделяем буфер заданного размера и вешаем поток. Всё. Возвращаем адресс выделенного буффера.
        Помоему довольно надёжный способ. Даже объекты синхронизации чел прекрутил.
        Ответить
    • Думаю, автор хотел сделать так, чтобы выделялось более двух кусков памяти.
      Ответить
    • ужасы какие-то, да и небезопасно (один пофейленный CreateThread - и приехали).
      интересно, на что местное free() похоже :)
      Ответить
      • очень просто, достаточно убить тред
        код ахуителен, осталось дождаться пока закончится место в стэке.
        Ответить
        • > очень просто, достаточно убить тред
          ну это я, как бы, догадываюсь :)
          просто раз тут такой malloc(), то free() бы тоже посмотреть хотелось.

          > осталось дождаться пока закончится место в стэке.
          для каждого треда свой стек имеется
          мне более интересно, как вот такое "char buffer[size];" компилится...
          Ответить
          • Похоже на какое-нибудь расширение С++. В С (стандарт С99) так можно.
            А вообще в С++ такое нифиг не нужно, есть ведь _alloca (_malloca/_freea) - она делает тоже самое, что и должен делать код в данном примере - выделять неизвестное при компиляции число байт на стеке. Автор видимо про это не знал.
            Ответить
        • Только тут зачатков для Free не видно. Придется создать map<адрес_выделенной_памяти,хэндл_потока >
          Ответить
          • Давайте допишем реализацию и будем ПРОдавать. :)
            Ответить
            • Это чья-нибудь дипломная работа?
              Ответить
              • > Это чья-нибудь дипломная работа?
                если так, то, Господи, сделай, чтобы такие потом на работу не устраивались...
                Ответить
    • Мрахаха(фр)хахаха.
      Ответить
    • Прикольно.
      Идёт CriticalSection.Lock();
      А затем:
      if( ... )
      return NULL;
      Одно выполнение условия и выделять память будет невозможно.
      Ответить
    • Самое прикольное, что на 32-х битной платформе Windows XP
      Sleep(INFINITY); длится около 29 дней, а после поток возобновит свою работу. Выходит по прошествии этого времени память самоосвободится. :D
      Ответить
      • Вот оно! и Free не нужно. этакий говносборщик мусора. Осталось еще дописать говнокод, который бы каждые 29 дней переалоцировал все использующиеся буферы, непереалоцированные буферы будут удалены! Проблема сборки буфера решена!
        Ответить
    • >INFINITY
      Ответить

    Добавить комментарий