C++ 删除 [] 崩溃

C++ delete[] crash

当我尝试 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] = '[=10=]';

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

    cEncryptedString[originalStringLength] = '[=10=]';

    encryptedString = cEncryptedString;

    delete[] cOriginalString;
    delete[] cEncryptedString;
}

originalStringencryptedString 属于 "string" 类型。

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

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

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

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