Swa*_*ari 1 c++ delete-operator
如何删除我在下面的代码中指定的指针:
char* ptr;
ptr=new char(65); // memory for one char is created and is assigned 'A'
strcpy(ptr,"asdf"); // how can string of length 4 chars are copied
delete ptr; // why am I getting debug error of Heap corruption detected
Run Code Online (Sandbox Code Playgroud)
我正在使用Visual C++ 2005
你正在分配一个char而不是一个数组.使用:
char* ptr;
ptr=new char[65];
strcpy(ptr,"asdf");
delete[] ptr;
Run Code Online (Sandbox Code Playgroud)
就像现在一样,你将第一个写入已a分配的char,其余的则写入一些从未分配给你的任意内存.运行时检测到(在调试版本上)并抱怨.
对我的答案中的问题做出评论:
C++没有任何机制来识别问题代码中的潜在错误.编译器知道传递给缓冲区大小的唯一方法strcpy是使用静态分析,这可能有效,也可能无效.但即使它确实如此,编译器也不知道它的语义strcpy.所以在编译时,它无法警告您错误.
现在,当缓冲区strcpy在运行时传递给它时,strcpy无法分辨缓冲区有多大.所以它只是假设调用者提供了一个合适的缓冲区,并继续复制.如果幸运的话,溢出分配的缓冲区将导致由于写入未分配的页面而立即崩溃.如果没有,你会得到内存损坏.
您获得的错误是调试构建中使用的机制的结果:内存管理器分配比您要求的更多的字节,并在其上写入特殊模式.然后,当释放分配的内存时,它会检查该模式是否仍然存在.如果没有,它会抱怨用户的代码已写入其中.在发布版本中,您没有这些额外的检查,并且此类错误可能会导致损坏而不会被注意到.
避免此类情况的唯一方法是编写更安全的代码:
std::string.它们为您进行内存管理,使您不必处理低级字符串函数.