永发信息网

关于C++中delete出错的问题

答案:3  悬赏:30  手机版
解决时间 2021-01-26 10:49
  • 提问者网友:星軌
  • 2021-01-25 14:52
把delete删掉后就没问题了,但加上后就会出现CRT detected that the application wrote to memory after end of heap buffer。程序的源代码在下面,请教出错原因和解决方法
#include
#include
using namespace std;
class String
{
char * data;
public:
String();
String(const char * pStr);//从常量字符串建立对象,按字符串长度分配内存//
~String()
{delete [] data;}
void Input();//从cin输入一个字符串,按字符串长度分配内存//
void Print();//向cout打印输出//
};
String::String(const char *pStr)
{
if (pStr)
{
data = new char[strlen(pStr) + 1];
strcpy(data, pStr);
}
else
{
data = new char[1];
*data = '\0';
}
}
void String::Input()
{
int i,m;
char c1[1024];
cout<<"请输入字符串:";
cin>>c1;
m = strlen(c1);
for(i = 0;i < m;i++)
{
*(data + i) = c1[i];
}
*(data + i) = '\0';
}
void String::Print()
{
int n = 0;
while((* data) != '\0')
{
cout<<* data ++;
n ++;
}
cout< data = data - (n - 3);
for(int i = 3;i < n;i++)
{
*(data ++) = '\0';
}
data = data - n;
}
int main()
{
char c[]="str";
String str1(c);
str1.Input();
str1.Print();
}
最佳答案
  • 五星知识达人网友:山河有幸埋战骨
  • 2021-01-25 16:21
char c[]="str";
String str1(c);
创建的string类对象的分配字符串缓冲区的大小为4个字节
如果str1.input();输入长度大于3个字节的字符串,会使上述的字符串缓冲区溢出。
全部回答
  • 1楼网友:七十二街
  • 2021-01-25 17:53
delete []操作符实际有两个作用,1对于一个数组若干相同类的对象,会调用每个对象的析构函数,2然后回收这个数组的内存。 对于简单类型数据的数组,例如int[],char []来说,是不需要对数组的每一个对象调用析构函数的,对于这些简单类型,只需要回收内存即可。 回收内存的大小是多少?这个问题对于不同内存分配器的实现来说,有不同的做法,一个非常可能的做法就是保存在new返回指针之前的内存位置,也就是p[-1]的位置。 case 1,没问题,指针对了,就能delete case 2,有问题,p[10]前一个是p[9],并不是new数组时候记录的分配大小信息,按照p[9]位置储存的信息来delete,出错。 case 3,没问题,指针值对了就行。 一个非常简化的operator new实现 t *new (int size) t *pt = (t*)malloc(size + sizeof(int)); *((int*)pt) = size; return (t*)((char *)pt + sizeof(int)); 这样返回给你的指针,比它malloc得来的,向后一个int,这里保存了给你分配内存的大小。 对于对象数组,使用delete[]和delete是不同的,如果传来的是数组而调用了delete,则只会调用第一个对象的析构函数,其余n-1个对象的析构没有调用。 在释放内存的作用上,两个操作符没有差别,也就是说对象数组只有第一个元素被析构,其余的没有析构,其余对象所分配的内存,没有机会在析构函数里释放,造成了内存泄漏。 对于简单类型的数组,没有区别,因为没有析构函数。
  • 2楼网友:woshuo
  • 2021-01-25 16:32
#include #include using namespace std; class String { char * data; public: String(); String(const char * pStr);//从常量字符串建立对象,按字符串长度分配内存// ~String(); void Input();//从cin输入一个字符串,按字符串长度分配内存// void Print();//向cout打印输出// }; String::~String() { delete [] data; } String::String(const char *pStr) { if (NULL != pStr) // { data = new char[strlen(pStr) + 1]; strcpy(data, pStr); } else { data = new char[1]; *data = '\0'; } } void String::Input() { int i,m; delete [] data; //增加的。 char c1[1024]; cout<<"请输入字符串:"; cin>>c1; m = strlen(c1) ; data = new char[m + 1];//增加的。 for(i = 0;i < m;i++) { *(data + i) = c1[i]; } *(data + i) = '\0'; } void String::Print() { int n = 0; while((* data) != '\0') { cout<<* data ++; n ++; } cout<
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯