今天写的QT程序,跑起来了以后报段错误,程序崩溃。
定位到问题后发现是因为用memset()函数操作结构体时,结构体中包含了QString类型的变量。
对此变量进行memset()操作时,会导致程序崩溃。
代码中跟进QString类型中,QString其实是一个类类型。
数据类型 = 数据抽象 = 没有行为的那些类型 = { int, char, double... }
类类型 = 行为抽象 = 有行为有属性的那些类型 = { vector<int>, student, employee, ...}
memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的。其原型是:
void* memset(void *_Dst, int _Val, size_t _Size);
参数解释:_Dst是目标起始地址,_Val是要赋的值,_Size是要赋值的字节数。
函数解释:将_Dst中当前位置后面的_Size个字节(typedef unsigned int size_t)用_Val 替换,并返回_Dst。
memset函数的作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
注意:memset是逐字节拷贝的。
这样在memset()类类型时,按字节顺序将对象所在空间清零,破坏了对象的成员结构,所以在调用的时候出现段错误导致程序崩溃。
所以上面的结论不太严谨,应该是memset()操作QString类型的变量后,再次调用该变量会导致程序崩溃,仅仅进行memset()而不调用,并不会有问题。