Ivan Feoctistov
Ivan Feoctistov

Reputation: 23

C++ delete[] crash

Program crashes when I'm trying to delete[] an array that was allocated with new[]. I don't see any reasons why this shouldn't work. The array is allocated in method and deleted in the end of it, it's local, everything should be fine, but it's not. I don't see any exception name that was thrown in debug, that's why I don't know where to dig. Through debug I see that crash is happening at first delete[] operator. Without those two deletes no crashes happening, but I don't want something to float in memory.

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 and encryptedString are of "string" type.

Upvotes: 1

Views: 566

Answers (2)

Michael Surette
Michael Surette

Reputation: 711

You can process individual characters in a std::string and it will both simplify your code and make it more robust. Here is one possible implementation.

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];
    }
}

Upvotes: 1

Mureinik
Mureinik

Reputation: 310983

You aren't allocating a char[], just a plain old char. Note that you should be using square braces ([]) and not parenthethis (()):

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

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

Upvotes: 3

Related Questions