rt

解决方案 »

  1.   

    char* p=new char[3];
    只能存放2个字符,因为还有一个字节位置需要存放结尾符。如果new了指针,又给指针赋值;
    p="123";
    是使指针指向了字符串常量,造成原来new出来的内存没有办法释放,简称内存泄漏。
      

  2.   


    书上有这样一段代码:
    用于CString 到char* 的转换:
    CString str;
    int length=str.GetLength();
    char* p=new char[length];
    p=str.GetBuffer(0);按楼上所说,岂不是有问题?
      

  3.   

    应该:lstrcpy(p,"123"); 楼上的改成:lstrcpy(p,str.GetBuffer(0));
     不然就白new了,肯定有内存泄露!
     你看哪本书上说的?
      

  4.   

    结合楼上两位师兄的说法,就是:
    char* p=new char[3];
    p="123;这样是会造成内存泄漏的,为什么?因为这个指针p="123"时,转向了,原来那三个字节的堆空间浪费了,没人管啦,指针指到常量区去了.-------在相互的意思吧?用strcpy,将"123"复制到申请到的那三个字节中去,指针并未转向,可以成功使用delete p;--------------晨风的意思吧? 只是这里复制三个字符进去可能有问题.两个好一点.
      

  5.   

    char* p="123"; 让P指向常量123。 但是因为123是常量,所以你想改变123的值就不行。
    如 p[0] = '2' 这样的语句会出错。与 char* p=new char[3];动态分配3个字节的空间。一定会delete 释放空间。p="123";和第一个字,让p指向一个常量。但是如果你把第二句和第三句放在一起用。
    你并非把123放到你申请的空间里了 而是让P指向了一个常。因为丢掉了。所申请的
    空间的句柄而没法sh释放造成内存泄漏。
    可以用memcpy付值。
      

  6.   

    再继续问个低级的问题,当char* p=new char[3]后,怎么给申请的空间赋值呢
      

  7.   

    memcpy或者strcpy都可以啊!
    最好是放2个字符,留一个给空字符做结束符!当然如果你就是要拷贝3个字符进去也没关系,你以后不要把它当字符串,而时刻注意到它是一个字节串,记得它只有3个有效字符就可以了!不然你很可能会带出一大堆莫名其妙的东西来!