В реализации Visual Studio из type_info, обычно находятся в C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ включить \ TypeInfo:Может ли кто-нибудь объяснить этот доступ к границам без ограничений в библиотеке MSVC++ std?
class type_info {
/* ... */
_CRTIMP_PURE bool __CLR_OR_THIS_CALL operator==(const type_info& _Rhs) const;
/* ... */
private:
void *_M_data;
char _M_d_name[1];
__CLR_OR_THIS_CALL type_info(const type_info& _Rhs);
/* ... */
};
Я заметил, что выполнение оператора равенства == использует указатель на персонаж _M_d_name + 1. Может ли кто-нибудь объяснить мне, как это работает, потому что кажется, что это было бы вне границ массива?
Реализация, C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ элт \ SRC \ ti_inst.cpp:
ASSERT_UNMANAGED_CODE_ATTRIBUTE
SECURITYSAFECRITICAL_ATTRIBUTE
bool type_info::operator==(const type_info& rhs) const
{
return (strcmp((rhs._M_d_name)+1, (_M_d_name)+1)?0:1);
}
Спасибо!
Это в основном способ написания переменной длины структуры. –
Имейте в виду, что это является частью «реализации», которая также включает в себя компилятор и т. Д., Поэтому они могут свободно делать то, что им нравится, в том числе определять их использование неопределенного поведения .... –
@ T.C. Спасибо за ваш комментарий. Есть ли шанс, что вы могли бы разработать немного? – trev