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;
}
originalString
和 encryptedString
属于 "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];
}
}
当我尝试 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;
}
originalString
和 encryptedString
属于 "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];
}
}