0 c++ char dynamic-memory-allocation
所以我执行这段代码
#include <cstdlib>
#include <iostream>
int main()
{
char *test = new char[10];
strcpy(test, "Hello Ther");;
std::cout << test << std::endl;
delete[] test;
std::cout << test << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
而输出是
你好Ther
你好Ther
似乎该delete[] test语句没有做任何事情......根本没有运行时或编译时错误
完全难过我
在你delete[]的数组后,没有更多的数组.之后通过该指针的任何访问都有未定义的行为.
delete[]应该调用数组元素上的析构函数并释放它使用的存储.由于char没有析构函数,它只是释放存储.仅释放存储意味着它不再使用.
FWIW,您的代码中还有一个未定义行为的实例."Hello Ther"有11个元素:最后有一个null('\0')终止符.strcpy将其放入缓冲区中只有10个元素是未定义的行为.你需要一个带有11个元素空间的缓冲区:"Hello Ther"的10个字符加上空终止符.
这种错误,即缓冲区溢出,是安全漏洞的常见来源.至少从20世纪80年代开始,就出现了这种错误的着名漏洞.明智的做法是避免使用这种不安全的原语,而选择安全的现代原语(以及"现代",我的意思是"从20世纪90年代开始"),就像这样std::string.因为,你知道,这是21世纪.