C ++删除[]崩溃

时间:2018-09-29 20:22:56

标签: c++ crash delete-operator

当我尝试delete[]分配了new[]的数组时,程序崩溃。我看不出任何不起作用的原因。数组在method中分配,并在方法末尾删除,它是本地的,一切都应该没问题,但事实并非如此。 我没有看到在调试中抛出的任何异常名称,这就是为什么我不知道在哪里挖掘的原因。 通过调试,我看到崩溃发生在第一个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;
}

originalStringencryptedString属于“字符串”类型。

2 个答案:

答案 0 :(得分:3)

您没有分配char[],而只是分配普通的旧char。请注意,您应该使用方括号([]),而不要使用括号(()):

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

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

答案 1 :(得分:1)

您可以在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];
    }
}