当我尝试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;
}
originalString
和encryptedString
属于“字符串”类型。
答案 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];
}
}