Pull to refresh

Comments 13

Открывая статью с заголовком «Разработка… на C++ для iOS и Android» (и соответствующими тегами), я ожидал интересных подробностей на тему организации кросплатформенной разработки мобильных приложений с нативным кодом.
Чего я не ожидал, так это того, что всё обещанное в заголовке, уместилось в одно предложение:
Допилив его под новые нужды, я получил приложение для разгадывания цветных филиппинских кроссвордов.

Тогда как собственно C++, как оказалось, использовался для разработки под Windows.
Тоже ожидал что-нибудь на Qt
В пункте Кодинг приложения есть отсылка к статье, где кроссплатформенная разработка рассмотрена более подробно.
Обратите внимание: процитировал тот же раздел. И в этом разделе нет ни строчки кода или вообще чего-либо о процессе кодинга, кроме той самой ссылки.
Я настаиваю на том, что название статьи нисколько не соответствует её содержанию.
В пункте Кодинг приложения есть отсылка к статье, где кроссплатформенная разработка рассмотрена более подробно.
Заканчивался 2016-й год, а C++ники продолжали вручную вызывать new и delete…
bitmap = new Gdiplus::Bitmap(filename);	
...
delete bitmap;

Скажите, а зачем вам вообще потребовалось Bitmap создавать динамически? Почему нельзя было объявить bitmap как автоматическую переменную на стеке?
Не заострял на этом внимание. Так давалось в тех примерах работы c GdiPlus, которые я изучал. Ну и я также скопипастил, не увидев в этом ничего криминального.
> Ну и я также скопипастил

Ну вот так в последствии C++ный код начинает и тормозить, и течь, и падать.

Зато разработчики PVS-Studio без работы и клиентов не останутся :)
Из-за того, что я создал Bitmap динамически, а потом в конце процедуры очистил занимаемую им память?
Ага.

Со временем подобный код превращается во что-то такое:
Gdiplus::Bitmap* bitmap; // (1)

    // Инициализация GDI+.
    Gdiplus::GdiplusStartup(&token, &input, &output);

    // Еще какие-то действия, которые появились в последствии.
    ...

    bitmap->SetSomeProperty(...); // Упс №1: bitmap еще не создан.
        // Из-за того, что в (1) переменная bitmap даже не получила
        // нулевого значения может произойти все, что угодно.

    // Еще какие-то действия, которые добавились позже.
    ...

    bitmap = new Gdiplus::Bitmap(filename); // Вот и создали объект.

    int w = bitmap->GetWidth();
    int h = bitmap->GetHeight();
    
    // Тут со временем появились какие-то проверки.
    if( w > SOME_LIMIT || h > SOME_ANOTHER_LIMIT )
      return; // Упс №2: утекла память, т.к. delete сделать забыли.

    for (int i = 0; i < w; i++)
        for (int j = 0; j < h; j++)
        {
           ...
        }
    delete bitmap;

Ну и работа с динамической памятью всегда дороже размещения объекта на стеке.

Ничего бы этого не было, если бы вы просто написали:
Gdiplus::Bitmap bitmap(filename);


Если вам кажется, что показанные выше потенциальные проблемы — это плод моей паранойи, то поспрашивайте разработчиков статических анализаторов или тех, кому приходится древний легаси код поддерживать. Там еще и не такие чудеса случаются.
Ваш аргумент понятен, ничего против не имею.
К сожалению, это не мой аргумент, а те рекомендации, которые рекомендуются к использованию уже пару десятков лет… :(
Sign up to leave a comment.

Articles