(Я предполагаю, что то, что вы разместили выше, на самом деле является фрагментом какого-то заголовочного файла.)
Подобные вещи обычно случаются, когда разные исходные файлы в вашей программе скомпилированы с разными настройками, связанными с размещением в памяти, такими как упаковка классов и настройки выравнивания. Ваш заголовочный файл включен в эти разные единицы перевода и интерпретируется по-разному из-за расхождений в настройках макета памяти.
Как только вы начнете передавать свои Test
объекты между этими единицами перевода, проблема обнаружится. Одна единица перевода создает объект Test
с одной структурой памяти, затем другие единицы трансляции читают или записывают в нее, предполагая совершенно другую структуру памяти. В вашем случае это ваши встроенные функции, которые интерпретируются по-разному в каждой единице перевода.
Если вы определите свои функции-члены как невстроенные, они примут макет памяти класса, характерный для исходного файла, в котором они определены. Это заметет проблему под ковер и заставит вещи "работать" (поскольку функции доступа теперь привязаны к одному макету памяти), но, тем не менее, это все еще не очень хорошая ситуация. Это все еще может привести к различным проблемам аналогичного характера в будущем.
Убедитесь, что все исходные файлы в вашей программе скомпилированы с точно такими же настройками макета памяти класса.
P.S. Как отметил Фред в комментариях, несоответствие в расположении памяти классов между единицами перевода может быть вызвано чем-то столь же прозаичным, как забывание перекомпилировать исходный файл после изменения файла заголовка, от которого зависит исходный файл.
Другим «популярным» источником таких проблем являются определения классов, которые зависят от директив препроцессора (т. е. макет класса, «настраиваемый» #ifdef
/#endif
сегментами). Если вы забудете #define
что-то важное в каком-либо исходном файле, который включает в себя ваш заголовочный файл, вы можете получить другую схему памяти для класса в этом исходном файле.
person
AnT
schedule
09.02.2011