zoukankan      html  css  js  c++  java
  • memset 在c++中使用细节注意

    C语言,在利用struct进行数据封装时,经常会使用memset(this,0,sizeof(*this))来初始化。而C++中,有时候也会用到struct,在利用memset进行初始化时,非常容易踩坑,有些地方需要注意。

    C++利用memset初始化struct注意点
    1. memset 是按字节对内存块进行初始化的函数,用来给某一块内存空间进行赋值的;

    2. memset 作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法;

    3. 成员变量可以是简单的内置类型(short、int、long、char、float、double);

    4. memset函数不能将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同          !!!!这是撞大运的 ):

         memset是逐字节进行初始化,比如对整型数进行初始化,int是32位的共四个字节,每个字节设置为n,则

         如果n=1,1为00000001 00000001 00000001 00000001,转为十进制数是1+1*2^8+1*2^16+1*2^24=16843009,而不是1;

         如果n=0,0为 00000000 00000000 00000000 00000000,转化为十进制为0;

         如果n=-1,-1为 11111111 11111111 11111111 11111111(原码的反码的补码),转化后为-1。    

    5. 类中含有C++类型的对象(string, list, set, map等)时,千万不要使用memset进行初始化,因为会破坏对象的内存,可用构造函数来实现;

    6. 类含有虚函数表时,初始化会破坏虚函数表,后续对虚函数的调用都将出现异常;

    7. 类含有指针时,初始化时,并不会初始化指针指向对象的值,而会把该指针设置为0;
    ---------------------

    #include <iostream>
    #include <string.h>
    using namespace std;
    int main()
    {
        struct Test
        {
            int a;
            string b;
         ~Test(){cout<<"++++++++++++++++"<<endl;} }; Test test; memset(
    &test,0, sizeof(test));   return -1; }


    ~/learing/6-6# ./memset
    ++++++++++++++++

    为毛没有 crash掉啊 !!!!!!!!!!!!!!

     

    程序在第12行创建test 对象,在程序执行完后会自动执行 test的析构。但是,在析构到test的string成员 b 的时候,由于b的内存被memset破坏,因此不能正常析构,从而导致crash。

  • 相关阅读:
    2017/4/14 afternoon
    2017/4/14 morning补
    2017/4/13 afternoon
    2017/4/13 morning
    2017/4/12 afternoon
    2017/4/12 morning
    4.17上午
    4.14上午
    4.13下午
    4.13上午
  • 原文地址:https://www.cnblogs.com/zhangkele/p/10983728.html
Copyright © 2011-2022 走看看