Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
1

по поводу memset

15.10.2016, 19:36. Показов 1907. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
здравствуйте, есть, допустим, такой код(rtti включен):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct img {
    virtual void a() = 0;
};
 
struct img_ : public img {
    void a() {
        std::cout<<"a\n";
    }
};
 
img_ i;
/*...*/
memset(&i, 0, sizeof(i));
i.a();
все нормально отрабатывает на gcc 5.4, но насколько корректно так нулить память? есть ли подвохи, ну мол, какой-нибудь замес с указателями на таблицу виртуальных функций
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2016, 19:36
Ответы с готовыми решениями:

memset()
Здравсвуйте. У меня возник вопрос касательно memset().Есть код: #include &lt;iostream&gt; #include...

memset
Попробовал потренироватся, как работает функция мемсет. Вот попробовал самый простенький код, но...

memset, memcpy
Использую MSVS 2008. Почему memcpy работает только с char? То есть, такой код работает: int...

Функция memset
Здравствуйте! Помогите, пожалуйста, с реализацией вызова memset в ассемблере. Я пишу ассемблерную...

7
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
15.10.2016, 19:40 2
Цитата Сообщение от tapochka Посмотреть сообщение
но насколько корректно так нулить память?
Абсолютно некорректно.

Цитата Сообщение от tapochka Посмотреть сообщение
какой-нибудь замес с указателями на таблицу виртуальных функций
Да, указатель на таблицу будет успешно убит.

Цитата Сообщение от tapochka Посмотреть сообщение
все нормально отрабатывает на gcc 5.4
Просто повезло, что данный код не использует разрушенные части класса.
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
15.10.2016, 19:50 3
C++
1
2
3
4
    img_ *i = new img_;
    /*...*/
    memset(i, 0, sizeof(img_));
    i->a();
так заинлайнить сложнее
2
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
15.10.2016, 21:37  [ТС] 4
TheCalligrapher, хм, а как корректно в таком случае? так как croessmah написал?
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
15.10.2016, 21:47 5
Цитата Сообщение от tapochka Посмотреть сообщение
а как корректно в таком случае?
Смотря какая задача (зачем это нужно?).
Но в любом случае - делать memcpy, memset и т.п. для non-trivial классов категорически нельзя.

Добавлено через 45 секунд
Цитата Сообщение от tapochka Посмотреть сообщение
так как croessmah написал?
Он написал пример, когда выстрел будет в ногу, а не в воздух.
1
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
15.10.2016, 22:21  [ТС] 6
Цитата Сообщение от DrOffset Посмотреть сообщение
Смотря какая задача (зачем это нужно?).
да вопрос знакомого... задумался вот, благодаря ему

Цитата Сообщение от DrOffset Посмотреть сообщение
memcpy
а memcpy то почему нельзя?
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.10.2016, 23:05 7
Цитата Сообщение от tapochka Посмотреть сообщение
а memcpy то почему нельзя?
если у класса есть конструктор копии,
то для копирования объекта именно его и нужно использовать.
только сам класс знает, как правильно себя копировать.

если конструктор копии запрещен - его в принципе нельзя копировать.

для нетривиальных классов, memcpy - это хак,
который позволяет сделать копию объекта
наплевав на все контракты класса.
1
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
16.10.2016, 06:39 8
Цитата Сообщение от tapochka Посмотреть сообщение
а memcpy то почему нельзя?
Короткий ответ: потому что стандартом языка запрещено, кроме некоторых тривиальных категорий классов.

Длинный ответ: класс может обладать скрытой (или открытой) внутренней структурой, которую невозможно правильно перенести при помощи memcpy. Например, объект класса может содержать указатели на части самого себя.
1
16.10.2016, 06:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.10.2016, 06:39
Помогаю со студенческими работами здесь

Аналог memset() из C++ в C#
Какая функция в C# выполняет то же что и memset() из C++?

Не найден memset
День добрый во время выполнения кода SCARD_READERSTATEA state;...

Неправильное использование memset
сам столкнулся как-то с такой вещью как неправильное использование memset на чистом си... до этого...

работа с memset в masm
Всем привет. Пытаюсь написать программу, работающую в режиме ядра - выделяю блок памяти, потом...

realloc vs (malloc + memset)
На одном форуме мне сказали, что realloc работает чуть ли не в полтора раза медленнее связки malloc...

Есть ли аналог memset
есть ли какой нибудь аналог memset в шарпе? я вот тут для себя только что открыл такую классную...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru