c++ struct 初始化相关的问题分析

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值