none
为什么执行了delete[],但是仍然内存泄漏 RRS feed

  • 问题

  • 我有一个函数,代码片段如下(代码风格不太一致是历史原因,请不要介意):

    ULONG FetchFile(PCHAR pServerIp, int Port, const char* pLocalPath, char* pRemoteFile)
    {
        CHAR *pBuffer = new CHAR[1024*1024];

        PPACKET pPkt = (PPACKET)pBuffer;
        pPkt->Head.Cmd = GET_CLIENT_FILE;
        strcpy(pPkt->Buffer, pRemoteFile);

        pPkt->DataLen = strlen(pRemoteFile)+1;
        pPkt->Head.PkgLen = sizeof(PACKET)+pPkt->DataLen;

    .........

        delete[] pBuffer;

        return 0;
    }

        这个函数被连续调用了两次,发生一次内存泄漏,用vld可以看到泄漏的数据内容是第一次调用时的数据。如果在两次调用之间sleep一定时间,比如30000ms,就不会泄漏了,这是为什么?

    2014年8月14日 2:33

答案

  • 你好,

    有没有其他函数在你第一次调用FetchFile 前也指向了相同的内存,并修改了里面的内容。可能是你其他地方对于内存的使用没有很好的释放。

    同时也可以用 CRT 库再查找一下内容泄漏,可以参考这个:

    Finding Memory Leaks Using the CRT Library

    May


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年8月15日 6:07

全部回复

  • 肯定是调用这个FetchFile函数导致的内存泄露吗?请检查一下您的FetchFile函数中是否有修改pBuffer指针本身的值,或者是代码中调用其它函数有分配内存?

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2014年8月15日 1:47
    版主
  • 谢谢回复。 我用vld跟踪内容泄漏,vld打印的堆栈指出泄漏的内存就是CHAR *pBuffer = new CHAR[1024*1024]; 并且根据泄漏时内存里的内容可以看出,泄漏的总是第一次调用FetchFile时的数据,第二次调用没有泄漏。

    pBuffer指向的内存块里的内容会被修改,但是pBuffer指针本身没有被修改,总是指向这块内存的起始地址。

    2014年8月15日 2:53
  • 你好,

    有没有其他函数在你第一次调用FetchFile 前也指向了相同的内存,并修改了里面的内容。可能是你其他地方对于内存的使用没有很好的释放。

    同时也可以用 CRT 库再查找一下内容泄漏,可以参考这个:

    Finding Memory Leaks Using the CRT Library

    May


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年8月15日 6:07