c++里面有些开辟的空间是不是不用你手动回收?我列出一些场合大家帮忙看看
  int a[20];
int *a=new int [20];
string str="123";
string  *buf;
buf=(string *)malloc (sizeof(str));
还有一种情况是buf=(char*)malloc(20);
buf[10]='\0';
这样是不是需要手动free 需要的话'\0'后的空间会正常释放?
还有我实例化类的话 CMYCLASS imyclass;和CMYCLASS *pimyclass =new CMYCLASS;这两种方式有什么差别,是不是new的话就一定要手动delete还有一个题外话问题 stl::string 是不是0结尾的?(NULL-terminal)
还有非unicode模式里面的汉字存储和unicode模式里面的汉字存储在内存里面是不一样的?(小头存储模式)
gb2312中汉字的编码和汉字的unicode的编码是一样的,2中模式中存储方式不一样?

解决方案 »

  1.   

    1.使用new或malloc申请的空间在堆区,一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
      一把需要程序员自己释放,使用delete或free
    2.其他的变量都在栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
    3. stl::string结尾是以‘\0’结尾的
      

  2.   

    http://topic.csdn.net/t/20031127/16/2502200.html
      

  3.   

    gb2312中汉字的编码和汉字的unicode的编码是不同的。
      

  4.   

    第一个,不是,而且即使有'\0'也不一定是结尾。如果用string::c_str(),会在后面加个'\0',然后把指针返回。
    第二个,没人规定unicode存储是大头或小头,当然用x86肯定都是小头。
    第三个,不一样,两者之间基本没有关系。
      

  5.   

    GB2312的原文还是区位码,从区位码到内码,需要在高字节和低字节上分别加上A0。高位在前UTF的字节序由BOM决定,LZ的概念很混杂!Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:
      在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。
      这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。
      

  6.   

    1、new对应delete,malloc对应free,如果new的空间不释放,在程序退出时由操作系统回收。
    2、int a[20];存放在栈上,在退出变量作用范围后被自动释放。
    3、string str="123"; 使用的是string的构造函数,内存由string类管理,不需要自己释放。
    4、\0只是C、C++中字符串结束的标志,与需不需要手动释放内存没有关系。
      

  7.   

    能详细的介绍下吗? 非unicode模式编程的时候 我取出2个字节肯定是一个汉字了,但这两个字节会是什么呢?
      

  8.   

    看看这个http://baike.baidu.com/view/1250144.htm