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条消息,并没有抛出这个崩溃。 其他任何人都可以在这看到我的问题。
答案 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_first
和find_second
的最小值均为零,在这种情况下,find_second-find_first - 1
为-1
int
。
但是,memcpy()
的第三个参数是size_t
类型,它是unsigned
类型。转换为-1
时size_t
的值是size_t
可以表示的最大值(例如,如果4294967295
是32位类型,则为size_t
) 。可以肯定的是,在某些情况下复制4294967295
并不是您想要的 - 特别是,前提malloc()
分配的大小为1
。
另一个问题是语句this->Header = "";
导致前一个值this->Header
(由前面的malloc()
返回)丢失。至少,这是内存泄漏。如果其他一些代码调用(实际上)free(this->Header)
,则结果是未定义的行为,因为字符串文字""
未使用malloc()
分配。
更一般地说,请考虑使用std::string
类型。它有许多有用的功能,并且在需要时可以干净地附加字符串 - 而不会出现像您所展示的内存管理错误。
除非你真的需要,否则不要使用this->
。在你的代码中,它只会使事情变得不那么清晰,几乎肯定不需要。