C ++ 2010,堆的腐败?

时间:2016-01-31 13:05:27

标签: c++ winapi

void IRC_MESSAGE::GetHeader()
{
    int find_first = this->FindChar(this->MessageText, ':');
    int find_second = 0;
    if(find_first > -1) {
        find_second = this->FindChar(this->MessageText+(find_first + 1), ':');
        if(find_second > -1) {
            //dies here on this message
            //this->MessageText = ":irc.betawarz.com 001 Fatal-Error[B] :Welcome to the Beta IRC Network Fatal-Error[B]!dragon@blank-value.cpe.net.cable.rogers.com"
            this->Header = (char *)malloc((find_second - find_first) + 1);
            ZeroMemory(this->Header, (find_second - find_first) + 1);
            memcpy(this->Header, this->MessageText + (find_first + 1), 
                  (find_second - (find_first + 1)));
            return;
        } else {
            this->Header = (char *)malloc(find_first + 1);
            ZeroMemory(this->Header, find_first + 1);
            if(find_first == 0) {
                this->Header = "";
            } else {
                memcpy(this->Header, this->MessageText, find_first);
            }
            return;
        }
    }
    this->Header = "NA";
    return;
}
-----------------------------
char *Header;    char *MessageText;    

int FindChar(char *,char),只返回所述值的第一个索引,如果没有找到则返回-1。

我的问题在于,当它具有以下MessageText时,我标记它在此处死亡。 它崩溃说:这可能是由于堆的损坏,这表明ApplicationX.exe或它已加载的任何DLL中的错误。 然而,在此之前我收到了3或4条消息,并没有抛出这个崩溃。 其他任何人都可以在这看到我的问题。

1 个答案:

答案 0 :(得分:0)

这里有一个问题

        this->Header = (char *)malloc((find_second - find_first) + 1);
        ZeroMemory(this->Header, (find_second - find_first) + 1);
        memcpy(this->Header, this->MessageText + (find_first + 1), 
              (find_second - (find_first + 1)));

malloc()分配find_second-find_first+1个字符。 memcpy()来电find_second - find_first - 1来自this->MessageText + find_first + 1的{​​{1}}个字符。 find_firstfind_second的最小值均为零,在这种情况下,find_second-find_first - 1-1 int

但是,memcpy()的第三个参数是size_t类型,它是unsigned类型。转换为-1size_t的值是size_t可以表示的最大值(例如,如果4294967295是32位类型,则为size_t) 。可以肯定的是,在某些情况下复制4294967295并不是您想要的 - 特别是,前提malloc()分配的大小为1

另一个问题是语句this->Header = "";导致前一个值this->Header(由前面的malloc()返回)丢失。至少,这是内存泄漏。如果其他一些代码调用(实际上)free(this->Header),则结果是未定义的行为,因为字符串文字""未使用malloc()分配。

更一般地说,请考虑使用std::string类型。它有许多有用的功能,并且在需要时可以干净地附加字符串 - 而不会出现像您所展示的内存管理错误。

除非你真的需要,否则不要使用this->。在你的代码中,它只会使事情变得不那么清晰,几乎肯定不需要。