在项目中,遇到一个由于结构体对齐问题造成程序崩溃问题,测试了半天,终于复现了出来。
首先定义一个头文件test.h:
class Test
{
public:
Test();
short id;
string name;
};
然后再建立test.cpp文件完成构造函数:
Test::Test()
{
}
可以看出这里构造函数什么都没干,但是它必须要,否则不会造成崩溃,这主要与下面的main.cpp有关:
#pragma pack(1)
#include "test.h"
int main()
{
Test *test=new test;
cout<<test->name;
return 0;
}
正常来说,应该输出为“ ”;如果没有定义构造函数,或者构造函数在头文件中实现,是正常输出为“ ”;但是在cpp中实现了构造函数,它最后报错read access violation at 0x0;
通过调试,发现类成员name提示无法访问。
查了半天资料,发现是与结构体对齐和成员string有关系;
因为在主函数开头定义了结构体对齐方式为1个字节,那么test.h里的结构体也就以一个字节的形式对齐;但是test.cpp构造函数没有,仍然以默认8个字节对齐;
在test.cpp打印Test的字节数和在main.cpp里面打印的字节数测试是不一样,一个为48,一个为42(在我的平台上string类