Класс MSVC ++. Приведение к структуре - PullRequest
1 голос
/ 31 января 2012

Я сейчас читаю существующий код в MS Visual C ++ 6.0. Я заметил кодовый шаблон, где они приводят объект в структуру.

Существует объект CMemory.

CMemory a;
MY_STRUCTURE_A* a = (MY_STRUCTURE_A*)(void *)a;
MY_STRUCTURE_B* a = (MY_STRUCTURE_B*)(void *)a;

Я проверил класс памяти Custom, и это действительно объект класса. В нем определен оператор =, но я не думаю, что это позволило бы переосмыслить его в структуре. Почему это делается? Как тип объекта приводится к разным объектам?

Есть идеи, почему это делается? Я знаю, что есть reinterpret_cast, и я предполагаю, что этот метод приведения к пустому указателю на указатель на структуру похож. Но я не уверен, если это то же самое. Безопасен ли этот шаблон для приведения объекта класса к структуре?

Примечание: CMemory - это просто произвольное имя используемого объекта. Он не является частью класса MFC.

Добавлено на основе комментария Некролиса. CMemory и имеет только 3 члена, объявленных в следующем порядке: (1) указатель на символ, (2) int, указывающий выделенную память (1) и (3) предыдущий и следующий указатель на другой экземпляр CMemory. У этого также есть много метода участника. Из того, что я понимаю, даже если я непосредственно приведу класс к структуре. Класс, который должен начаться, должен начинаться с первой переменной-члена, которая является указателем на символ.

class CMemory {
public:
    CAMemory();
    ...  Other methods
private:
    char *m_pMemory;
    int m_memorySize;
    ... Other field
}

1 Ответ

1 голос
/ 31 января 2012

Исходя из названия класса и приведения, CMemory более чем вероятно является общим тегом блока памяти (для GC, произвольной хеш-таблицы и т. Д.), И для доступа к памяти его тегирование требует приведения.Конечно, это «лучшая догадка», это ничего не значит без просмотра полного кода для CMemory.

Безопасно ли это, совсем нет, это не только UB, но нет проверки (по крайней мере, вваш пример) относительно того, является ли объект, который вы приводите, является объектом, представленным макетом памяти.Кроме того, поскольку это C ++, им следует избегать приведений C (как вы заметили. Двойное приведение фактически позволяет обойти ошибки / предупреждения компилятора, что всегда является худшим способом их решения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...