每次读取文件时,我都尝试使用不同长度的字节来读取二进制文件。获得值后,我尝试将字节转换为 char*
。
我创建了一个简单的代码如下:
//This code is compiled in Visual Studio 2010
typedef unsigned char BYTE;
BYTE *s;
s = new BYTE[3]; // I read 2 bytes from the file, I add +1 to reserve NULL
s[0]= 'a'; s[1]='b';s[2]=NULL; //just an example I get 2 bytes from file
char* b;
b = new char(sizeof(s));
strcpy(b,(char*)s);
s[0]='x';
cout << s <<"--"<< b<< "--"<< endl;
delete[] s;
delete[] b;
cin.get();
return 0;`
但是,代码生成错误“检测到堆损坏”。当我删除该行时,delete[] b;
程序运行良好。但是我不确定下次是否会出现问题。请有人解释一下吗?删除delete[] b;
会不会导致内存泄露?有什么改进我的代码的建议吗?
最佳答案
这个:
b = new char(sizeof(s));
应该是:
b = new char[sizeof(s)];
否则你不是在创建一个数组,你只是在创建一个指向字符代码为 sizeof(a) 的 char 的指针。
因此 delete[] b 导致它崩溃,因为你试图删除一个没有数组的数组。
还有另一个问题,sizeof(s) 不会给你你想要的。 s 是一个动态分配的数组,因此调用 sizeof(s) 不会 会为您提供 s 中字符大小的总和。 sizeof(s) 将返回指向 s 的指针的大小。
关于c++ - 删除 char* 进行字节转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13964612/