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

    +69.5

    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
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    #include <iostream>
    using namespace std;
    class MyException
    {
    public:
    	MyException(char *msg) { m_msg = msg; }
    	~MyException(){}
    	char *GetError(){return m_msg;}
    protected:
    	char *m_msg;
    };
    
    int main()
    {
    	int *buffer;
    	try
    	{
    		buffer = new int[255];
    		if (buffer == NULL)
    		{
    			MyException *exception = 
    					new MyException("Memory allocation failed!");
    			throw exception;
    		}
    		else
    			delete buffer;
    	}
    	catch (MyException *exception)
    	{
    		char *msg = exception->GetError();
    		cout << msg << endl;
    	}
    return 0;
    
    }

    Книга "Использование Viusal C++" Кейт Грегори. Глава 24 о предотвращении утечек памяти и работе с исключениями.

    Запостил: ccoder, 20 Февраля 2010

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

    • Если не ошибаюсь, catch автоматом освобождает память выделенную здесь MyException *exception = new MyException("Memory allocation failed!");
      Ответить
      • С чего бы? Нихрена он не освобождает. А передавать эксепш по указателю не нужно никогда, ибо смысла в этом - ноль.
        Ответить
        • Я и не говорю, что это правильно )) Просто в книге был такой пример ! Меня это вообще удивило, как в главе об утечках памяти может быть ТАКОЙ код :)
          Ответить
          • Слишком много книжек по сипипи и слишком мало реально хороших. Однозначно. А код с утечкой в главе "как бороться с утечками" - даже не знаю, и смешно и плакать хочется (мля...)
            Ответить
          • Ведь возможно, что это переводчик намудрил. Технич. литературу переводят абы как...
            Ответить
            • А что там мог намудрить переводчик ?
              Код-то никто не трогает при переводе...
              Ответить
              • Допустим, автор мог, описывая код, иметь в виду сарказм, а переводчик подал буквально.

                Грубо говоря,
                Автор: "Это правильный код с точки зрения индуса"
                Переводчик: "Это правильный код"

                Пораскинуть мозгом слабо? Или технич. литература сплошь состоит из сырцов, блядь?
                Ответить
                • Хм. Посмотрел в оригинале, никакого сарказма у Грегори не увидел...
                  ЗЫ Можно было и без матов написать или тяжело мозгом пораскинуть ? Сразу почему-то кажется, что общаюсь с быдлом каким-то честное слово... Без обид.
                  Ответить
    • 1)После buffer = new int[255];
      это условие if (buffer == NULL) никогда не выполнится.
      так new бросит исключение bad_alloc.
      2)Да ещё это какой-то пример в вакууме:
      else
      delete buffer;
      Сразу удаляем, есл и все получилось.
      3)MyException *exception =
      new MyException("Memory allocation failed!");
      Эта память никогда не освободится.
      4)Более того выделять память для исключения, после предыдущей неудачи в работе с памятью - Излишне самоуверенно.
      5)cout << msg << endl;
      Кто сказал, что в другой версии компилятора для этой операции не выделяется память?
      Хотя судя по коду, автор не уверен, что в его компиляторе не выделяется память для этой операции. )))))))
      Ответить
      • 1) Фигня полная. По-умолчанию возвращается NULL, если не получилось выделить память.

        Да и код в книжке приводился как неправильный.
        Ответить
        • Ничего подобного! Код в книжке указывался как правильный! И такой пример у Грегори не один!
          Ответить
      • Ещё и конструктор у MyException занимательный.
        Ответить
    • Да что вы хотите, там небойсь книгу эту какой-нибудь пердун или маразматик писал. За редкими исключениями, книги пишут те, кто имеет "огромный опыт программирования" но за это время кодить нормально не научился, вот и пишет книги =)
      Ответить
      • "Кто умеет — тот делает, кто не умеет — тот учит, а кто не умеет учить — тот руководит." (q)
        Ответить

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