Страницы

Поиск по вопросам

четверг, 6 декабря 2018 г.

Как правильно обнулить память?

Собственно очень интересует вопрос, если например массив нужно "обнулить", "очистить", не знаю как правильно выразится, чтобы туда не попал "мусор", нужно это делать мемсетом или можно заполнить массив нулями просто и это будет одно и тоже "{ 0 }", хотелось бы выслушать мнение людей с большим "опытом работы" в программировании, есть ли разница и может ли это повлечь какие-то проблемы в больших проектах(программах) или может это нужно делать как-то по другому?
OPENFILENAME ofn = { 0 }; ZeroMemory(&ofn, sizeof(ofn));
или
char FileName[260]; ZeroMemory(&FileName, sizeof(FileName));


Ответ

Для начала, локальные переменные необходимо инициализировать до первого чтения. Чтение неинициализтрованной переменной — очень серьёзная ошибка программиста, и может привести, например, к вылету программы. (Почитайте про undefined behaviour.)
Затем, код наподобие
OPENFILENAME ofn = { 0 };
уже есть инициализация, дополнительное «обнуление памяти» не нужно. (В современных версиях C++ обычно достаточно просто OPENFILENAME ofn = {};.)
В случае, когда вы объявляете массив, проще опять-таки попросить об инициализации компилятор (char FileName[260] = {};), чем обнулять массив вручную (ZeroMemory).
Другое дело, если вы хотите инициализировать массив ненулевым значением, это придётся делать вручную. Для «единичных» структур обычно можно всё ещё применять инициализацию:
MENUITEMINFO mii = { sizeof(MENUITEMINFO) };

Если вы собираетесь сразу же записывать данные в вашу структуру/массив, инициализация не имеет особого смысла. (Хотя хороший оптимизатор может увидеть это и выкинуть её.) Если вы собираетесь заполнять массив значениями, не имеет смысла перед этим прописывать всё нулями. Однако, если вы передаёте структуру/массив в чужую функцию, имеет смысл заранее посмотреть в документацию, читает функция эту структуру данных, или лишь заполняет её. Если вы твёрдо уверены, что функция лишь заполняет вашу структуру, можно пропустить инициализацию.

Комментариев нет:

Отправить комментарий