Обнаружен glibc - двойное освобождение или повреждение - PullRequest
2 голосов
/ 09 января 2012

При отправке кода (вставленного ниже) в онлайн-компилятор gcc я получаю следующие сообщения об ошибках.

* обнаружен glibc / run-1326102706-2046832693 / решение: двойное освобождение или повреждение (! Prev): 0x091901a8 ** =======

Код выглядит следующим образом:

# include <iostream>
# include <string>
# include <list>
# include <cstring>

using namespace std;

int main()
{
    int test_cases, i, score, str_len;
    string str;
    char first_char, current_char;
    list <int> strlist;
    list <int> :: iterator it; 

    cin>>test_cases;

    char *cstr[test_cases]; //Creating an array of cstr pointers (test_cases number of pointers)

    while(test_cases > 0)
    {
        cin>>str;
        first_char = str.at(0);
        str_len = str.length();
        score = str_len;
        strlist.clear();

        cstr[test_cases-1] = new char[str_len];
        strcpy(cstr[test_cases-1],str.c_str()); //copying the input str into cstr. This is done to minimize the complexity of std::string's at function.

        for(i=1;i<str_len; i++)
        {
            current_char = *(cstr[test_cases-1]+i);
            if (current_char == first_char)
            {
                score++; strlist.push_front(1);
                it = strlist.begin();
                if (it != strlist.end())
                    it++;
            }

            while (!strlist.empty() && it != strlist.end())
            {
                if (current_char == *(cstr[test_cases-1] + *(it)))
                {
                    (*it)++;it++;score++;
                }
                else
                    it = strlist.erase(it);
            }
            if (!strlist.empty())
                it = strlist.begin();

        }
        cout<<score<<endl;
        delete(cstr[test_cases-1]);
        test_cases--;

    }

    return 0;
}

Как уже упоминалось в самом коде, я изначально использовал std :: string, но обнаружил, что std :: string.Функция at была довольно медленной (особенно потому, что у этой проблемы действительно большие входные строки).Поэтому я решил сохранить строку ввода в массиве символов, чтобы была возможна прямая индексация в определенной позиции.

Ценю любую помощь.

Ответы [ 3 ]

3 голосов
/ 09 января 2012

Я вижу две проблемы:

cstr[test_cases-1] = new char[str_len]; // Not allocating space for terminating NULL.

delete(cstr[test_cases-1]); // Incorrect delete, should be delete[]
                            // As already pointed out by mooware

Измените эти две строки на:

cstr[test_cases-1] = new char[str_len + 1];

delete[] cstr[test_cases-1];
2 голосов
/ 09 января 2012

Вы используете array-new ("new char [str_len]") для размещения строк, а scalar-delete ("delete (cstr [test_cases-1])") для их удаления. Вы всегда должны сопоставлять операторы new и delete, поэтому при использовании array-new также используйте array-delete ("delete [] cstr [test_cases-1]").

1 голос
/ 09 января 2012

У вас есть две ошибки.Один здесь:

    cstr[test_cases-1] = new char[str_len];
    strcpy(cstr[test_cases-1],str.c_str());

Вы выделяете один байт слишком мало.Это должно быть new char[str_len+1], поскольку strcpy копирует терминатор.

Другое здесь:

    delete(cstr[test_cases-1]);

Вы не можете выделить с помощью new[] и освободить с помощью delete.Если вы используете new[], вы должны освободить delete[].

...