在动态2D阵列中检测到堆损坏

时间:2011-08-31 07:46:45

标签: c++ data-structures memory-management

尝试使用delete

释放内存时出现堆损坏错误

这是代码

char** split(char* inputstr, char delim, int& count){

char** ostr=NULL;
int numStr = 0;
int i=0,j,index=0;


while(inputstr[i]){ 

    if(inputstr[i++]==delim)
        numStr++;

}

if(inputstr[i-1]!=delim)
    numStr++;


count= numStr;
ostr = new char*[numStr];

i=0;
while(inputstr[i])
{
    j=i;
    while(inputstr[j] && inputstr[j] != delim)
        j++;

    ostr[index] = new char[j-i+1];

    //istr[j] = 0;

    strncpy(ostr[index], inputstr+i,j-i);

    ostr[index++][j-i]=0;

    i=j+1;

}

return ostr;

}

for(int i=0,countStr;i<_numComp;i++){

            char** _str = split(str[1+i],':',countStr);

            message.lastTransList.cmpName[i] = new char[strlen(_str[0])+1];
            strcpy(message.lastTransList.cmpName[i],_str[0]);
            message.lastTransList.price[i] = atof(_str[1]);

            for(int i=0; i<countStr;i++)
            {
                delete[] _str[i];    //this is working fine
                _str[i] = 0;

            }

            delete[] _str;     //exception is thrown at this line
        }

我无法找到问题所在。请帮忙!

1 个答案:

答案 0 :(得分:0)

很难看到任何错误,您的索引可能会出现问题,导致分割函数中的缓冲区溢出只有在您尝试删除char **数组时才会捕获。

如何转换为像carlpett推荐的std :: string和std :: vectors(这是一个很好的推荐)。

类似的东西:

void split(const std::string& str_, char delimiter_, std::vector<std::string>& result_)
{
  std::string token;
  std::stringstream stream(str_);
  while( std::getline(stream, token, delimiter_) ) result_.push_back(token);
}

然后,你只需用你的字符串,分隔符和一个空的std :: vector调用它,最后得到一个填充的子串矢量。您不必使用new / delete并担心内存问题。