关于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<
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯