Перейти к содержанию

Глупый вопрос C++


Werston

Рекомендуемые сообщения

Ребятки, а может быть такое, что специально используют указатель на объект, где это не нужно. Просто, ради стрелочки 

me->Say("123");

Или это бред и мне дальше нужно учить основы C++? Прост, смотрю много кода, разбираю его и бываю встречаю такое. Просто, эт не только с указателями на объекты связано, а и с другими вещами, что серьeзно усложняет изучение С++

Ссылка на комментарий
Поделиться на другие сайты

Если в вкратце, то эти селекторы отличаются внутренним устройством, т.е при использовании селектора .(точка),  программа работает используя переменную, но используя селектор -> программа работает с адресом, т.е обращается через указатель и в зависимости от кривизны рук программиста это может привести к появлении уязвимости UAF(Use After Free)

 

Подробней про указатели и ссылки под спойлером.

Спойлер

Указатели и ссылки
Попытки связать указатели с динамическими объектами часто приводят к недоразумениям. В сущности, они не имеют друг с другом ничего общего. Вы можете получить адрес стекового объекта и
выполнить обратное преобразование, то есть разыменование (dereferencing) адреса динамического объекта. И на то, и на другое можно создать ссылку.

 


{
  foo f;
  foo* p = &f;
  f.MemberFn();  // Использует сам объект
  p->MemberFn(); // Использует его адрес
  p = new foo;
  foo& r = *p;  // Ссылка на объект
  r.MemberFn(); // То же, что и p->MemberFn()
}


Как видите, выбор оператора . или -> зависит от типа переменной и не имеет отношения к атрибутам самого объекта. Раз уж мы заговорили об этом, правильные названия этих операторов (. и ->) — селекторы членов класса (member selectors). Если вы назовете их «точкой» или «стрелкой» на семинаре с коктейлями, наступит гробовая тишина, все повернутся и презрительно посмотрят на вас, а в дальнем углу кто-нибудь выронит свой бокал. Недостатки стековых объектов Если использовать оператор delete для стекового объекта, то при большом везении ваша программа просто грохнется. А если вам (как и большинству из нас) не повезет, то программа начнет вести себя, как ревнивая любовница она будет вытворять, всякие гадости в разных местах памяти, но не скажет, на что же она разозлилась. Дело в том, что в большинстве реализаций C++ оператор new записывает пару скрытых байтов перед возвращаемым адресом. В этих байтах указывается размер выделенного блока. По ним оператор delete определяет, сколько памяти за указанным адресом следует освободить. При выделении памяти под стековые объекты оператор new не вызывается, поэтому эти дополнительные данные отсутствуют. Если вызвать оператор delete для стекового объекта, он возьмет содержимое стека над вашей переменной и интерпретирует его как размер освобождаемого блока. Итак, мы знаем по крайней мере две причины, по которым следует избегать стековых объектов если у вас нет действительно веских доводов в их пользу: 1. Адрес стекового объекта может быть сохранен и использован после выхода за границы области действия объекта. 2. Адрес стекового объекта может быть передан оператору delete. Следовательно, для стековых объектов действует хорошее правило: Никогда не получайте их адреса или адреса их членов. Достоинства стековых объектов С другой стороны, память в стеке выделяется с головокружительной быстротой так же быстро, как компилятор выделяет память под другие автоматические переменные (скажем, целые). Оператор new (по крайней мере, его стандартная версия) тратит несколько тактов на то, чтобы решить, откуда взять блок памяти и где оставить данные для его последующего освобождения. Быстродействие одна из веских причин в пользу выделения памяти из стека.

Джефф Элджер БИБЛИОТЕКА ПРОГРАММИСТА C++

 

  • Понравилось 2
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.