struct在平常应用中使用的广泛。使用中还是需要几点注意的。
0x01 首先,说一下结构体中指针初始化的问题。
平常的使用中,可能不怎么注意结构体的初始化问题,因为不去初始化也不见得会有什么问题。但是,但凡指针要使用它前就必须保证指针变量的值是一个有效的值;否则,它指向的内存一定是垃圾数据。也许会中后面程序中出现问题。
比如;
struct Test
{
int nNum;
char* szSTR;
test* stest;
}
一般的使用
Test struct_test;
memset(&Struct_test,0,sizeof(Test));
//或者 指针
上面memset时候并不会初始化其中的szSTR,还是需要手动完成。
在使用结构体中的szSTR时候,还是要对其进行初始化。
struct_test.szSTR = new char[MAX_PATH]; //当然malloc也行
这样的结构体,成员指针或者分配内存,或者指向常量区,不然它们就都是野指针;
分配内存的话,就要释放,分配内存的时候,是从外向里,即先分配结构体的指针,再分配成员指针,释放的时候,是从里向外,先释放成员指针,再释放结构体指针,顺序不能错的。
总之每个malloc都要对应一个free,每一个new要对应一个delete。
new 与malloc http://blog.csdn.net/chenzy945/article/details/46844283
//malloc只管分配内存;但是new却可以分配内存并且调用构造函数;
0x02 结构体初始化遇到的问题,STL 和CString
如上两位,应该是写程序时候用到挺多的吧。无论是STL中的string vector map 等还是CString 均是使用频率较多的。
中结构体中使用还是会遇到些问题的。比如说vector是对象,不是一段内存,如果对其进行内存相关操作,放在struct里面不是很好,malloc只管分配内存;但是New却可以分配内存并且调用构造函数;;而CString是MFC定义好的数据结构,虽说中结构体中能用,但是不要使用memset对结构体进行操作,会让程序出现问题的,这里具体涉及到了CString内部定义的赋值与析构函数,这里也提醒了我们,在对类内成员进行操作的时候,最好是通过类为我们提供的接口进行,而不要自作主张。如果一定使用Cstring去完成的话,推荐使用class去存放更为方便。
此外,结构体中含有虚函数的话,使用memset也会出现问题。可以发现,中使用memset时候还是有诸多需要注意的地方。
c++的内存方面总会遇到很多问题,慢慢学习。2015-8-15;