Обнаружено повреждение кучи в динамическом двумерном массиве - PullRequest
0 голосов
/ 31 августа 2011

Я получаю ошибку повреждения кучи при попытке освободить память с помощью 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 голосов
/ 31 августа 2011

Трудно увидеть какую-либо ошибку, может быть что-то не так с вашей индексацией, которая вызывает переполнение буфера в функции split, которая обнаруживается только при попытке удалить массив char **.

Как насчет преобразования в векторы std :: string и std ::, которые рекомендует carlpett (это хорошая рекомендация).

как то так:

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 и беспокоиться о проблемах с памятью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...