Rock
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору V0lt Цитата: Ваш код на С. Цитата: Насколько корректна такая функция? | В Вашей функции, на редкость, плохо все. А если код еще предполагается быть С++, то плохи еще и дизайн и вообще сама задумка. Для понимания того, что на самом деле делает Ваша функция, необходимо знать, что предполагалось будет делать WriteString. Видимо, точный ответ на Ваш вопрос Вас не интересует, поэтому будем приблизительно гадать. К сожалению, потребуются довольно глубокие знания о том, как работает компьютер. Итак, Цитата: const WCHAR* GetSomeString(const int param) | В С++ (а вообще везде) возвращать просто указатель на память в большинстве случаев очень плохо. Вы, скорее всего, хотите вернуть строковое представление param. Скорее всего, под это представление будет выделена память (с запасом), а само представление займет меньше места, чем выделенная память. В Вашем случае пользователю GetSomeString придется эти две цифры как-то угадывать. Не то, чтобы это невозможно, но неудобненько. Цитата: В этом месте текущий указатель стека сохранится в самом стеке, в buff запомнится текущий указатель стека, а к самому указателю стека добавится число 40 * sizeof(WCHAR). То есть, стек (область памяти) увеличится. При этом в операционных системах с виртуальной памятью возможен случай, когда физическая страница по текущему указателю стека отсутствует, сгенерируется исключение и ОС подпихнет в указанное место очередную четырехкилобайтную страницу Вашего ОЗУ. Цитата: Здесь ничего сложного, но тоже все плохо. WriteString, скорее всего, будет писать в buf строковое представление param, при этом она не знает, сколько памяти выделено под buf и писать в него она будет, скрестив пальцы, что места хватит. Скрещивание пальцев -- очень плохая технология в программировании. Да и вообще в чем бы то не было. Так, Вам вряд ли понравится, если врач начнет лечить Вашего ребенка наудачу, скрестив пальцы. Цитата: В этом месте мы покидаем область видимости (отмечена {}) и в одном из регистров процессора возвращаем указатель на память внутри нашего стека (см. выше). Что значит покидаем область видимости? Это значит, что из стека достанется старое значение указателя стека и значение указателя стека восстановится таким же, каким оно было до вызова GetSomeString, память, которая могла была быть дополнительно выделена под стек (см. выше), станет не нужна и ОС может убрать физическую страницу из Вашего виртуального адресного пространства. К сожалению, вместе с этой страницей пропадет и Ваше строковое представление. Итак, что имеет пользователь GetSomeString? Он имеет указатель на освобожденную область памяти, которая может все еще быть на месте, а, может, и нет. Раньше быстро поднятое не считалось упавшим и до появления Windows 3.1, где было реализовано управление памятью с ее перемещением, подобное программирование допускалось даже в коммерческих продуктах. Для одной мегапопулярной игрушки Майкрософт даже определяло ее запуск и отключала механизм перемещения памяти, чтобы подобные ухищрения продолжали работать. К сожалению, почти все современные операционные системы являются системами с виртуальной памятью и подобные фокусы с запретом перемещений памяти в них чисто технически невозможны. | Всего записей: 1264 | Зарегистр. 10-04-2003 | Отправлено: 15:45 08-05-2020 | Исправлено: Rock, 15:47 08-05-2020 |
|