我遇到了一个问题,来自 Bjarne Stroustrup 的书编程:使用 C++ 的原理和实践(第 2 版)中的练习,位于第 17 章练习部分的最后,练习 7:
如果不使用
delete linearray1;
,程序可以正常工作。
因此,问题出在删除分配的动态内存时。
控制台中没有错误消息或警告。 然而,VS Code 向我展示了这一行中的问题 (
delete linearray1
)。
以黄色突出显示整条线。
请告诉我如何解决这种情况下的问题。如何正确清除分配的内存?
#include <iostream>
void fillarray(std::string& array)
{
char* linearray1 {new char};
char* line = linearray1;
std::cin >> line;
while (*line)
{
if (*line == '!')
break;
array += *line;
line++;
}
delete linearray1;
}
int main()
{
std::string linearray1;
fillarray(linearray1);
std::cout << "\n" << linearray1;
return 0;
}
总结评论...
fillarray()
仅为 1 char
分配动态内存,然后将该指针传递给采用 operator>>
指针的 char*
重载。 然后,该重载将尝试读取并输出 more 多于 1 个 char
(包括 '\0'
终止符),直到遇到结束输入的空白字符。 因此,您最终会通过超出动态内存的范围来调用“未定义的行为”,从而破坏周围的内存。在这种情况下,delete
只是该行为的不知情受害者。如果您确实想一次读取输入 1 char
,请使用读取单个
operator>>
的 char
重载,或使用 istream::get(char&)
方法,例如:void fillarray(std::string& array)
{
char* pch {new char};
while ((std::cin >> *pch) && (*pch != '!'))
// or: while (std::cin.get(*pch) && (*pch != '!'))
{
array += *pch;
}
delete pch;
}
但是,不需要自己动态分配 1
char
,只需使用本地
char
变量即可,例如:void fillarray(std::string& array)
{
char ch;
while ((std::cin >> ch) && (ch != '!'))
// or: while (std::cin.get(ch) && (ch != '!'))
{
array += ch;
}
}
但是,在这种特殊情况下,您可以使用
std::string
直接读取目标
std::getline()
,例如:void fillarray(std::string& array)
{
std::getline(std::cin, array, '!');
}