new出的内存,不知道为什么销毁不了。。

xychzh 2010-07-30 06:57:58

void ConvertText(const char* pSrc, string& dstStr)
{
int maxCount = 12;
int strSize = int(dstStr.length());
strSize = strSize+1 + (strSize/maxCount);

char* pStrDst = new char[strSize];

int cnt = 0; // 每遇到一个宽字节的字符,cnt++,用以判断cnt的数量是否是2的倍数,即判断是否整齐
for(int i=0,j=0,begin=0; pSrc[j]!='\0'; i++)
{
if ((begin+1)%(maxCount-1) == 0)
{
// j处字节是宽字符
if((unsigned char)pSrc[j] > 0x80)
{
if (cnt%2 == 0)
{
pStrDst[i++] = pSrc[j++];
pStrDst[i++] = pSrc[j++];
pStrDst[i] = '\n';
}
else
{
pStrDst[i++] = pSrc[j++];
pStrDst[i] = '\n';
}
}
// j处字节是普通字符
else
{
// 若j+1处是宽字符,则仅拷贝当前字符,然后插入'\n'
if ((unsigned char)pSrc[j+1] > 0x80)
{
pStrDst[i++] = pSrc[j++];
pStrDst[i] = '\n';
}
// j+1仍然是普通字符,一起拷贝,然后插入'\n'
else
{
pStrDst[i++] = pSrc[j++];
pStrDst[i++] = pSrc[j++];
pStrDst[i] = '\n';
}
}

begin = 0;
cnt = 0; // 重置计数
}
else
{
// 遇到宽字符字节,cnt++
if ((unsigned char)pSrc[j] > 0x80) cnt++;
pStrDst[i] = pSrc[j++];

begin++;
}
}

pStrDst[strSize-1] = '\0';

dstStr = string(pStrDst);
delete [] pStrDst;
}



程序执行到delete [] pStrDst;就弹出错误对话框。。
很奇怪。
...全文
282 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuliang11 2010-07-31
  • 打赏
  • 举报
回复
引用 2 楼 skyworth98 的回复:

char* pStrDst = new char[strSize];

delete [] pStrDst;

应该是delete pStrDst;


如果内置类型用delete pStrDst也可以
但是如果是自定义类对象的话,这样就肯定错了
数组还是要[]的
hzy694358 2010-07-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 skyworth98 的回复:]

char* pStrDst = new char[strSize];

delete [] pStrDst;

应该是delete pStrDst;
[/Quote]
如果内置类型用delete pStrDst也可以
但是如果是自定义类对象的话,这样就肯定错了
数组还是要[]的
Allenve13 2010-07-31
  • 打赏
  • 举报
回复
第三行改为 char* pStrDst = new char[strSize+1]; 看看吧!!!

cattycat 2010-07-30
  • 打赏
  • 举报
回复
表示原来的数组长度有多少字符。
cattycat 2010-07-30
  • 打赏
  • 举报
回复
int strSize = int(dstStr.length());
不是这个吧,dstStr不是你的引用参数么,应该是
int strSize = strlen(pSrc);
xychzh 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 cattycat 的回复:]
越界会破坏原来new的时候保存分配数据块大小的信息。
[/Quote]

您给的这个算法,所求的strSize和for循环中插入的字符个数不相等,这个问题您能解决么?是大小计算错了,还是多插入了??
jackyjkchen 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 xychzh 的回复:]
引用 14 楼 jackyjkchen 的回复:
系统分配了多少内存系统知道,这就是为什么free和delete都不需要提供size的原因。

所以,你越界了系统在销毁内存时是知道的,所以给你提示。

你说,是给你提示好,还是不给提示好?


那现在的问题其实就是下面这个问题了:

C/C++ code

char* pCh = new char[4];
……
[/Quote]
呃,有什么不同么?pCh[4]越界……
xychzh 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jackyjkchen 的回复:]
系统分配了多少内存系统知道,这就是为什么free和delete都不需要提供size的原因。

所以,你越界了系统在销毁内存时是知道的,所以给你提示。

你说,是给你提示好,还是不给提示好?
[/Quote]

那现在的问题其实就是下面这个问题了:

char* pCh = new char[4];
pCh[0] = 'a';
pCh[1] = 'b';
pCh[2] = 'c';
pCh[3] = '\0';

pCh[4] = 'd';

delete [] pCh;


无法delete
cattycat 2010-07-30
  • 打赏
  • 举报
回复
越界会破坏原来new的时候保存分配数据块大小的信息。
xychzh 2010-07-30
  • 打赏
  • 举报
回复
更正一下楼上的:
strSize/maxCount是求将要插入的'\n'的个数
然后加上dstStr.length()+1,得出总大小strSize
jackyjkchen 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xychzh 的回复:]
引用 12 楼 jackyjkchen 的回复:
你认为你的
int strSize = int(dstStr.length());
这句话没问题么?好好看看dstStr.length()的大小吧!这可是目标地址啊,你能预先知道该有多大?


这句话的确没问题,
有问题的是这一句:
strSize = strSize+1 + (strSize/maxCount);
这里是要加上要……
[/Quote]
系统分配了多少内存系统知道,这就是为什么free和delete都不需要提供size的原因。

所以,你越界了系统在销毁内存时是知道的,所以给你提示。

你说,是给你提示好,还是不给提示好?
xychzh 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jackyjkchen 的回复:]
你认为你的
int strSize = int(dstStr.length());
这句话没问题么?好好看看dstStr.length()的大小吧!这可是目标地址啊,你能预先知道该有多大?
[/Quote]

这句话的确没问题,
有问题的是这一句:
strSize = strSize+1 + (strSize/maxCount);
这里是要加上要插入的'\n'的个数,strSize被计算出43,结果实际要插入的'\n'个数是46
这就使得,在for循环里,pStrDst越界多插入了3个字符。

另我不解的是,为什么在pStrDst的内存中越界插入几个字符,就导致无法delete呢?
jackyjkchen 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xychzh 的回复:]
引用 8 楼 jackyjkchen 的回复:
引用 7 楼 xychzh 的回复:
不是访问越界,如果把那个delete 删掉,程序执行没问题,就是加上这个delete 程序才报错。
奇怪,for循环仅仅是赋值而已,大小没有改变,怎么就delete 不了?

访问越界不一定立即报错(看人品)

但delete曾经越界的指针一定报错


我试过,我换一个没有被改变的指向首元素的……
[/Quote]
看来你没明白

请测试如下代码,同样没有改变指向,看看是否是一样的错误提示


int main()
{
char *p = new char[2];
p[2] = 0;
delete []p;
}



你认为你的
int strSize = int(dstStr.length());
这句话没问题么?好好看看dstStr.length()的大小吧!这可是目标地址啊,你能预先知道该有多大?
xychzh 2010-07-30
  • 打赏
  • 举报
回复
可否有人帮忙试一下这个函数,就拷贝一下,看如何delete这个内存,而系统不报错?带个值就可以,也不麻烦,。。
xychzh 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jackyjkchen 的回复:]
引用 7 楼 xychzh 的回复:
不是访问越界,如果把那个delete 删掉,程序执行没问题,就是加上这个delete 程序才报错。
奇怪,for循环仅仅是赋值而已,大小没有改变,怎么就delete 不了?

访问越界不一定立即报错(看人品)

但delete曾经越界的指针一定报错
[/Quote]

我试过,我换一个没有被改变的指向首元素的指针,进行delete,仍然报错,总之,不管什么方法,经过了for循环之后,这个内存怎么也销毁不了了。。。
xychzh 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cattycat 的回复:]
难道你数据很长,最后有可能越界了,那就把new的空间设大一点。
最后pStrDst[strSize-1] = '\0';
改成pStrDst[j]='\0';
[/Quote]

不对吧,整个大小一直是strSize,在这个尾部加上'\0'哪里有错,for循环做的仅仅是赋值,就算他越界赋值,也不影响我delete
何况如果是for循环越界,程序肯定会报错,但问题是程序只在delete那报错。
jackyjkchen 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xychzh 的回复:]
不是访问越界,如果把那个delete 删掉,程序执行没问题,就是加上这个delete 程序才报错。
奇怪,for循环仅仅是赋值而已,大小没有改变,怎么就delete 不了?
[/Quote]
访问越界不一定立即报错(看人品)

但delete曾经越界的指针一定报错
xychzh 2010-07-30
  • 打赏
  • 举报
回复
不是访问越界,如果把那个delete 删掉,程序执行没问题,就是加上这个delete 程序才报错。
奇怪,for循环仅仅是赋值而已,大小没有改变,怎么就delete 不了?
野男孩 2010-07-30
  • 打赏
  • 举报
回复
应该是pStrDst的访问越界了。


lz试一下把 char* pStrDst = new char[strSize];

改成 char* pStrDst = new char[strSize*10];

cattycat 2010-07-30
  • 打赏
  • 举报
回复
难道你数据很长,最后有可能越界了,那就把new的空间设大一点。
最后pStrDst[strSize-1] = '\0';
改成pStrDst[j]='\0';
加载更多回复(4)

64,677

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧