写法一:
char *seltext = new char[5000];
seltext = (char *)GetClipboardData(CF_TEXT); //从剪贴板取回刚才存入的内容
.......
.......
delete[] seltext;写法二:
char *seltext = new char[5000];
::strcpy(seltext,(char *)GetClipboardData(CF_TEXT)); //从剪贴板取回刚才存入的内容
.......
.......
delete[] seltext;我看着任务管理器``发现写法一每次执行了都会+4k内存``心里想``不会吧``我都delete了``还想怎样``靠`后来一句一句注释``找到了
seltext = (char *)GetClipboardData(CF_TEXT); //从剪贴板取回刚才存入的内容
这句话上``我在想``会不会是GetClipboardData返回的缓冲区没delete掉?``就试试写法二``发现写法二也会内存泄漏```可是只会泄一次``哈``也就是只+一次4k``之后再执行``就不加了``大哥们``是怎么回事?

解决方案 »

  1.   

    char *seltext = new char[5000];//seltext指向被分配的地址
    seltext = (char *)GetClipboardData(CF_TEXT); //现在seltext指向了哪里?
                                                 //是不是应该用memcpy()??
    .......
    .......
    delete[] seltext;
      

  2.   

    seltext = (char *)GetClipboardData(CF_TEXT); 
    seltext已经被改变为临时变量
    new 的变量没有被释放
    方法2就释放了
      

  3.   

    方法二:
    The strcpy function copies strSource, including the terminating null character, to the location specified by strDestination. No overflow checking is performed when strings are copied or appended. The behavior of strcpy is undefined if the source and destination strings overlap.是不是char[5000]容量太小?
      

  4.   

    用了memcpy还是同样的问题。。情况和写法二一样`
      

  5.   

    晕,很明显,方法一的指针都变了,原来new的没有释放,当然泄漏了
      

  6.   

    你确定真的泄漏了?
    试一下重载new[]及delete[],记录new[]及delete[]的次数,看看是不是真的有内存泄漏。
    在方法二中,只增加一次4K内存,不能说明有内存泄漏。
      

  7.   

    方法一是肯定泄漏了``看了好多次``每执行一次``就+一次``
    方法二应该也是吧?执行完后``该delete的都 delete了```可是还是会增加``
      

  8.   

    是不是GetClipboardData的问题
      

  9.   

    方法一
    char *seltext = new char[5000];
    seltext = (char *)GetClipboardData(CF_TEXT); //从剪贴板取回刚才存入的内容
    .......
    .......
    delete[] seltext;这个肯定写了 你的seltext = (char *)GetClipboardData(CF_TEXT); 已经改变了原来的指针的了,后面的delete[] seltext 不是 new char[5000]这个指针了,而是(char *)GetClipboardData(CF_TEXT)
    这个指针。这个段代码十分不安全,内存泄露+溢出方法二
    写法二:
    char *seltext = new char[5000];
    ::strcpy(seltext,(char *)GetClipboardData(CF_TEXT)); //从剪贴板取回刚才存入的内容
    .......
    .......
    delete[] seltext;
    这个是正确的,但是会有时溢出,但是不存在内存泄漏,溢出的时候,是(char *)GetClipboardData(CF_TEXT))这个取得的内容大于char[5000]的空间了我个人的想法.....