Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заполнить выделенную динамическую память нулями 
:(
    Опции темы
Alca
Дата 21.8.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Заполнить выделенную динамическую память нулями ('\0')?
например буфер можно обнулить так:
Код

BYTE buf[2048];
memset(buf, '\0', 2048);

Можно ли делать так?
Код

char *pszText  = new char[2048];
memset(pszText, '\0', 2048);
//...
delete [] pszText;

Заполниться ли выделенная память нулями?

Это сообщение отредактировал(а) Alca - 21.8.2008, 16:01


--------------------
PM WWW ICQ Skype Jabber   Вверх
cutwater
Дата 21.8.2008, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



Естественно можно


--------------------
user posted image
PM MAIL   Вверх
UnrealMan
Дата 21.8.2008, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Alca @  21.8.2008,  16:57 Найти цитируемый пост)
например буфер можно обнулить так

А можно и так:

Код

BYTE buf[2048] = {};


В случае с new стандарт позволяет записывать так:

Код

int *p = new int[10]();

Но не все современные компиляторы соблюдают стандарт в этом плане (например, MinGW 3.4.5 тупо не инициализирует массив).
PM MAIL   Вверх
Alek86
Дата 21.8.2008, 17:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



кстати, вопрос немного филогсофский

обычно не рекомендуют смешивать сишный стиль и плюсовой
кто из программистов тогда использует вместо memset std::uninitialized_fill?


--------------------
user posted image    user posted image
PM MAIL   Вверх
UnrealMan
Дата 21.8.2008, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Alek86 @  21.8.2008,  18:41 Найти цитируемый пост)
обычно не рекомендуют смешивать сишный стиль и плюсовой
кто из программистов тогда использует вместо memset std::uninitialized_fill? 

std::uninitialized_fill, применяемый к уже существующим объектам, - это типа C++-стиль? smile
PM MAIL   Вверх
Alek86
Дата 21.8.2008, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



лучше чем memset


--------------------
user posted image    user posted image
PM MAIL   Вверх
UnrealMan
Дата 21.8.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Alek86 @  21.8.2008,  19:07 Найти цитируемый пост)
лучше чем memset 

О-о-о, да, мы избавились от необходимости умножения на sizeof(тип элемента массива). Аллилуйя! Мегадостижение. А что мсье будет делать, если тип элементов массива сменится с POD на не POD?
PM MAIL   Вверх
andrew_121
Дата 21.8.2008, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(UnrealMan @  21.8.2008,  17:26 Найти цитируемый пост)
Но не все современные компиляторы соблюдают стандарт в этом плане (например, MinGW 3.4.5 тупо не инициализирует массив).

Просто немного не так:
Код

BYTE buf[2048] = "\0";




--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
UnrealMan
Дата 21.8.2008, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(andrew_121 @  21.8.2008,  19:32 Найти цитируемый пост)
Просто немного не так:

Я про второй свой пример говорил (с new который). Первый, к счастью, работает и в MinGW.

Добавлено через 12 минут и 43 секунды
Цитата(andrew_121 @  21.8.2008,  19:32 Найти цитируемый пост)
BYTE buf[2048] = "\0";

Кстати, по стандарту, в отличие от

Код

BYTE buf[2048] = {};

код

Код

BYTE buf[2048] = "\0";

гарантированно инициализирует лишь первые два элемента символьного массива.

PM MAIL   Вверх
vinter
Дата 21.8.2008, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(UnrealMan @  21.8.2008,  19:13 Найти цитируемый пост)
 А что мсье будет делать, если тип элементов массива сменится с POD на не POD?

ну тогда исчезнет необходимость в обнулении, спор то как раз о POD типах


--------------------
Мой блог
PM MAIL WWW   Вверх
Alca
Дата 21.8.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Код

char *pszText  = new char[2048];
memset(pszText, '\0', 2048);
char cTemp = 'w';
cTemp = pszText[0];    //<-- здесь 0
cTemp = pszText[1];    //<-- здесь 0
cTemp = pszText[2];    //<-- здесь 0
cTemp = pszText[3];    //<-- здесь 0
cTemp = pszText[2047];    //<-- здесь ещё 0
cTemp = pszText[2048];    //<-- здесь мусор
cTemp = pszText[2049];    //<-- здесь мусор
cTemp = pszText[2050];    //<-- здесь мусор
//...
delete [] pszText;


Это сообщение отредактировал(а) Alca - 21.8.2008, 19:16


--------------------
PM WWW ICQ Skype Jabber   Вверх
UnrealMan
Дата 21.8.2008, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(vinter @  21.8.2008,  20:13 Найти цитируемый пост)
ну тогда исчезнет необходимость в обнулении

... и ради достижения корректности программы возникнет необходимость в устранении существующего обнуления, причём компилятор на эту необходимость не укажет. Коли уж наша программа разваливается, стоит нам на шаг отойти от POD-типов, о каком C++-стиле может идти речь?

Цитата(vinter @  21.8.2008,  20:13 Найти цитируемый пост)
спор то как раз о POD типах 

Я тут никакого спора не вижу. Если некое средство считается более крутым лишь потому, что оно из STL, а не из стандартной библиотеки C, то это не что иное, как детский сад. Над псевдоинтеллектуальными рассуждениями я обычно просто стебусь, а не спорю с ними.

Это сообщение отредактировал(а) UnrealMan - 21.8.2008, 19:37
PM MAIL   Вверх
bsa
Дата 21.8.2008, 20:53 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Alca @ 21.8.2008,  19:16)
Код

char *pszText  = new char[2048];
memset(pszText, '\0', 2048);
char cTemp = 'w';
cTemp = pszText[0];    //<-- здесь 0
cTemp = pszText[1];    //<-- здесь 0
cTemp = pszText[2];    //<-- здесь 0
cTemp = pszText[3];    //<-- здесь 0
cTemp = pszText[2047];    //<-- здесь ещё 0
cTemp = pszText[2048];    //<-- здесь мусор
cTemp = pszText[2049];    //<-- здесь мусор
cTemp = pszText[2050];    //<-- здесь мусор
//...
delete [] pszText;

Этот код может вызвать ошибку Access Violation или Segmentation fault, в зависимости от ОС.
Это типичная ошибка новичка - выход за границы массива.

Это сообщение отредактировал(а) bsa - 21.8.2008, 20:53
PM   Вверх
Alek86
Дата 21.8.2008, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



немного оффтоп

если не заметил, у меня стоял знак вопроса
а это значит, что я задавал вопрос и ожидал ответа а не ржачки
(кстати нормального ответа, почему все так любят memset и ни разу не используют std::uninitialized_fill)

Цитата(UnrealMan @  21.8.2008,  19:34 Найти цитируемый пост)
 Над псевдоинтеллектуальными рассуждениями я обычно просто стебусь, а не спорю с ними.

а поскольку ты над всеми стебешься, кто с тобой не согласен, то... smile

и по теме

Цитата(UnrealMan @  21.8.2008,  18:13 Найти цитируемый пост)
А что мсье будет делать, если тип элементов массива сменится с POD на не POD?

насколько я вижу в примерной реализации std::uninitialized_fill там вообще не идет речи ни о ПОД ни о каком-то конкретном куске памяти. есть только 2 итератора и значения. что ты имел в виду, когда писал о ПОД? (только, пожалуйста, если можно, ответь серьезно, без клоунады)


--------------------
user posted image    user posted image
PM MAIL   Вверх
andrew_121
Дата 21.8.2008, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(Alek86 @  21.8.2008,  21:25 Найти цитируемый пост)
только, пожалуйста, если можно, ответь серьезно, без клоунады

Респект и уважуха smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0877 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.