前段时间遇到两种崩溃问题
一个是进入函数崩溃,同事遇到的,我没有代码,只是截取片段来看看了很久没看出问题
一个基类A派生出子类B,C,D,然后用map存了std::map<int,A*> ,实际只存了一个值A* pTestA = new B,后面逻辑中取出这个值调用它的一个虚函数,进入函数就崩溃,开始下意识都觉得可能是类指针被销毁或者虚函数指针指向问题,实际调试发现,类指针正常,里面成员函数和变量地址都正常,虚函数指针也和创建时候一样,而且把类单独拿出来调试只是把函数实现改一下发现也正常。最后才发现是这个函数内部有个变量申请的控件非常大,char data[4*1024*1024]导致进入函数就由于栈区内存过大而崩溃。
另一个是自己遇到的,传入一个QString ,在给一个自定义结构体赋值的时候崩溃,断点调试发现结构体里面已经初始化但是声明的变量中去看对应的成员显示问号未知内存,成员都是变量不是指针,然后把QString改为std::string仍然不行,但是用成员变量去分别接收这些传入的值就正常,只要定义这个结构体的变量来接收就崩溃,然后全局查了下这个结构体发现另一个地方有定义过,因为这个逻辑有两种实现方式并没有公用的头文件去定义公共变量,另一地方定义过,而且成员有差别导致这个问题。所以命名空间还是很有必要的,而且尽量把数据结构定义在公共的头文件中