C ++ удалить [] сбой - PullRequest
       7

C ++ удалить [] сбой

0 голосов
/ 29 сентября 2018

Программа падает, когда я пытаюсь delete[] массив, который был выделен с new[].Я не вижу причин, почему это не должно работать.Массив размещается в методе и удаляется в конце, он локальный, все должно быть хорошо, но это не так.Я не вижу ни одного исключения, которое было выброшено при отладке, поэтому я не знаю, где копать.Через отладку я вижу, что сначала происходит сбой delete[] оператора.Без этих двух delete сбоев не происходит, но я не хочу, чтобы что-то всплывало в памяти.

void Atbash::EncryptString(string t)
{
    char *cOriginalString;
    char *cEncryptedString;
    unsigned int originalStringLength;
    unsigned int i;
    unsigned short j = 0;

    originalString = t;
    originalStringLength = originalString.length();

    cOriginalString = new char(originalStringLength + 1);
    cEncryptedString = new char(originalStringLength + 1);

    strcpy_s(cOriginalString, originalStringLength + 1, originalString.c_str());

    cOriginalString[originalStringLength] = '\0';

    for (i = 0; i < originalStringLength; i++)
    {
        while (cOriginalString[i] != alphabet[j])
        {
            j++;
        }
        cEncryptedString[i] = alphabet[N - j - 2];
        j = 0;
    }

    cEncryptedString[originalStringLength] = '\0';

    encryptedString = cEncryptedString;

    delete[] cOriginalString;
    delete[] cEncryptedString;
}

originalString и encryptedString относятся к типу "string".

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Вы можете обрабатывать отдельные символы в std :: string, и это упростит ваш код и сделает его более надежным.Вот одна из возможных реализаций.

void Atbash::EncryptString(string originalString)
{
    encryptedString.clear();
    encryptedString.reserve(originalString.size());

    for (auto ch:originalString)
    {
        auto index= alphabet.find(ch);
        if (index != npos)
            encryptedString += alphabet[N - index - 2];
    }
}
0 голосов
/ 29 сентября 2018

Вы не выделяете char[], просто старый char.Обратите внимание, что вы должны использовать квадратные скобки ([]), а не скобки (()):

cOriginalString = new char[originalStringLength + 1];
// Here ------------------^------------------------^

cEncryptedString = new char[originalStringLength + 1];
// And here ---------------^------------------------^
...