Comments 13
Открывая статью с заголовком «Разработка… на C++ для iOS и Android» (и соответствующими тегами), я ожидал интересных подробностей на тему организации кросплатформенной разработки мобильных приложений с нативным кодом.
Чего я не ожидал, так это того, что всё обещанное в заголовке, уместилось в одно предложение:
Тогда как собственно C++, как оказалось, использовался для разработки под Windows.
Чего я не ожидал, так это того, что всё обещанное в заголовке, уместилось в одно предложение:
Допилив его под новые нужды, я получил приложение для разгадывания цветных филиппинских кроссвордов.
Тогда как собственно C++, как оказалось, использовался для разработки под Windows.
+7
В пункте Кодинг приложения есть отсылка к статье, где кроссплатформенная разработка рассмотрена более подробно.
0
Заканчивался 2016-й год, а C++ники продолжали вручную вызывать new и delete…
Скажите, а зачем вам вообще потребовалось Bitmap создавать динамически? Почему нельзя было объявить bitmap как автоматическую переменную на стеке?
bitmap = new Gdiplus::Bitmap(filename);
...
delete bitmap;
Скажите, а зачем вам вообще потребовалось Bitmap создавать динамически? Почему нельзя было объявить bitmap как автоматическую переменную на стеке?
0
Не заострял на этом внимание. Так давалось в тех примерах работы c GdiPlus, которые я изучал. Ну и я также скопипастил, не увидев в этом ничего криминального.
-2
> Ну и я также скопипастил
Ну вот так в последствии C++ный код начинает и тормозить, и течь, и падать.
Зато разработчики PVS-Studio без работы и клиентов не останутся :)
Ну вот так в последствии C++ный код начинает и тормозить, и течь, и падать.
Зато разработчики PVS-Studio без работы и клиентов не останутся :)
+1
Из-за того, что я создал Bitmap динамически, а потом в конце процедуры очистил занимаемую им память?
-1
Ага.
Со временем подобный код превращается во что-то такое:
Ну и работа с динамической памятью всегда дороже размещения объекта на стеке.
Ничего бы этого не было, если бы вы просто написали:
Если вам кажется, что показанные выше потенциальные проблемы — это плод моей паранойи, то поспрашивайте разработчиков статических анализаторов или тех, кому приходится древний легаси код поддерживать. Там еще и не такие чудеса случаются.
Со временем подобный код превращается во что-то такое:
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);
Если вам кажется, что показанные выше потенциальные проблемы — это плод моей паранойи, то поспрашивайте разработчиков статических анализаторов или тех, кому приходится древний легаси код поддерживать. Там еще и не такие чудеса случаются.
+1
Only those users with full accounts are able to leave comments. Log in, please.
Филиппинские кроссворды. Доработка мобильной 2D головоломки для работы с цветными кроссвордами