2016-01-31 64 views
-3
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][email protected]" 
      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。C++ 2010,堆的腐败?

我的问题在这里是我的标记,它死在这里,当它有下面的MessageText。 它崩溃说:这可能是由于堆的腐败,这表明ApplicationX.exe或它已加载的任何DLL中的错误。 但我在此之前得到3或4条消息,不会折腾这次崩溃。 其他人在这里可以看到我的问题。

+2

在C++中使用'new'和'delete',而不是'malloc'和'free'。 – Downvoter

+0

您不需要代码中的所有'this->' –

+0

您是否正在使用MFC? – stackptr

回答

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()请致电this->MessageText + find_first + 1复制find_second - find_first - 1个字符。 find_firstfind_second的最小值都为零,在这种情况下,find_second-find_first - 1-1,作为int

但是,memcpy()的第三个参数是size_t类型,它是unsigned类型。当转换为size_t时,-1的值因此是最大值a size_t可以表示(例如,如果size_t是32位类型,则为4294967295)。公平地说,在某些情况下复制4294967295不是您的意图 - 特别是,前面的malloc()分配的大小为1

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

更一般地,考虑使用std::string类型。它有一些有用的工具,并在需要时干净地附加字符串 - 而不会像您所示的那样出现内存管理错误。除非你真的需要它,否则不要使用this->。在你的代码中,它让事情变得不太清晰,几乎肯定不需要。

+0

它所做的是获取:和之间的字符串值,如果它找到第二个字符串,它将进入else语句并返回字符串从0到第一个:如果它是0,则返回第一个:anyways它返回标题为“”。 总会有至少1个。 –

+0

@Jaime你在这里没有深度。这不是如何编写C++。考虑重新审视基础知识并质疑你是否掌握了它们。 –

+0

转换完全std :: string后,我发现我的问题不在这个类内,但在另一个位置。只是从char *转换为char []。似乎很奇怪,但再次工作。无论最后一条消息如何,我都会给你一个+。 –