奇怪的delete[]
动态字符数组:
char *sSentence;
char *sSentenceResult;
//分配空间
sSentence=new char[nLen];//nLen是传入的整形参数
sSentenceResult=new char[nLen*3];
//处理
.
.
.
//释放
delete[] sSentence;//调试发现释放时Assert Failed(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse))
delete[] sSentenceResult;//同上
运行时宣告失败忽略后,就是Access Violation。还有就是并不是每次都出错,大家讨论一下是怎么回事?
问题点数:60、回复次数:22Top
1 楼JessC(人类一思考,上帝就发笑.)回复于 2006-07-01 11:20:57 得分 0
DEBUG_NEW有内存诊断能力,出现这种情况的一个解释是:操作出界Top
2 楼nwumengfei(孟斐)回复于 2006-07-01 11:32:12 得分 0
难道new的空间和delete不一致吗?怎么会出现这种情况的?怎么解决啊?能不能指点一下?Top
3 楼JessC(人类一思考,上帝就发笑.)回复于 2006-07-01 11:57:24 得分 0
我是说,看一下,你的操作是不是超出了分配的内存大小Top
4 楼jixingzhong(瞌睡虫·星辰)回复于 2006-07-01 12:15:16 得分 0
_BLOCK_TYPE_IS_VALID
虽然这个信息不是绝对给出了问题所在,
但是也可以查查 ....
呵呵,还没有遇见这个问题过 ..
看看对这个 new 的空间有那些操作吧 ...
或者把你的 delete[] 位置上调, 看看在 哪个操作后这个delete[] 失效
呵呵 这是个笨办法 见笑...Top
5 楼Piboye(柳月清风)回复于 2006-07-01 12:21:35 得分 0
很可能你改了 sSentence;sSentenceResult;的值,也可能中途释放了内存过
Top
6 楼UPCC(杂食动物)回复于 2006-07-01 12:38:41 得分 20
delete[] sSentence;//调试发现释放时Assert Failed(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse))
delete[] sSentenceResult;//同上
------------------------------
其实很简单,你把sSentence,sSentenceResult指针移动了(比如sSentence++一类的),所以就出现那样的问题。
你应该这样:
char *sSentence,*tmpsSentence;
char *sSentenceResult,*tmpsSentenceResult;
//分配空间
tmpsSentence=sSentence=new char[nLen];//nLen是传入的整形参数
tmpsSentenceResult=sSentenceResult=new char[nLen*3];
.............
delete[] tmpsSentence;
delete[] tmpsSentenceResult;Top
7 楼OOPhaisky(异化$渴望成功~~)回复于 2006-07-01 14:43:24 得分 0
同意UPCC(杂食动物),在你的“处理”过程中肯定做了不该做的事情。Top
8 楼nwumengfei(孟斐)回复于 2006-07-01 21:28:49 得分 0
按说按照UPCC(杂食动物)老兄的说法即便是修改了sSentence和sSentenceResult
delete的时候应该能删除掉吧,不会断言失败以及Access Violation吧!
可是我按照老兄说的修改后还是这样儿!
◎##¥¥%……Top
9 楼UPCC(杂食动物)回复于 2006-07-01 21:48:15 得分 0
那就贴代码啊,不要让大家来猜的Top
10 楼nwumengfei(孟斐)回复于 2006-07-01 22:41:23 得分 0
代码挺多的,是中科院计算所的分词程序ICTCLAS:
下载地址:
http://www.nlp.org.cn/project/project.php?proj_id=6
有兴趣的可以下载调试!
注意:标注成XML格式时有问题!Top
11 楼nwumengfei(孟斐)回复于 2006-07-02 15:28:25 得分 0
再顶Top
12 楼UPCC(杂食动物)回复于 2006-07-02 16:08:48 得分 0
下载失败。密码...Top
13 楼lddLinan(不再五行中)回复于 2006-07-02 16:27:46 得分 10
将char *sSentence;
char *sSentenceResult;
改为char * const sSentence;
char *const sSentenceResult;然后编译看看是否有地方修改了sSentence, sSentenceResult.
BTW:lz是计算所的么?我有好几个同学都在那里Top
14 楼nwumengfei(孟斐)回复于 2006-07-03 10:00:02 得分 0
俺 不是 目前需要作东西需要分词 这是个词法分析器!
我试试看!Top
15 楼qiaozhiwei(乔)回复于 2006-10-30 11:21:45 得分 0
是sSentence的地址改变了,看下有没有类似 sSentence =...这样的操作,会使指针位置变化Top
16 楼corrupt(喜欢 睡在床板下 的思考)回复于 2006-10-30 14:32:57 得分 0
不用怀疑,肯定是 自己中途指针 操作错误Top
17 楼weijiangshanwww(天气预报:今天会下分,偶尔下几颗星星!)回复于 2006-10-30 14:48:34 得分 0
delete[] sSentence;//调试发现释放时Assert Failed(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse))
delete[] sSentenceResult;//同上
运行时宣告失败忽略后,就是Access Violation。还有就是并不是每次都出错,大家讨论一下是怎么回事?
==========================================
ACCESS VIOLATION肯定是你的指针的错误了!
检查你的指针,而且不是每次出错则可能是没执行指针出错的地方Top
18 楼szpc689()回复于 2006-10-30 14:52:02 得分 0
我想是nLen 大于你实际控制数,所以在输出时有那样的提示。要么不输出,要么小于实际的控制数Top
19 楼xxyyboy(壮志凌云)(★★★★★)回复于 2006-10-30 17:10:44 得分 10
空间的删除和分配,跟空间中的值没有关系。
1。指针是不是被改变了,加const验证一下。
2。有没有成功的申请到内存,也就是说指针是否是有效的?Top
20 楼li01bin(啊!斌)回复于 2006-10-31 15:51:48 得分 10
小伙子些的代码挺好的,如果再多些判断就更好了。
char *sSentence = NULL;
char *sSentenceResult = NULL;
//分配空间
sSentence=new char[nLen];//nLen是传入的整形参数
if (sSentence == NULL)
{
//error
}
sSentenceResult=new char[nLen*3];
if (sSentenceResult == NULL)
{
//error
}
//处理
.
.
.
//释放
if (sSentence != NULL)
{
delete[] sSentence;
sSentence = NULL;
}
if (sSentenceResult != NULL)
{
delete[] sSentenceResult;//同上
sSentenceResult = NULL;
}
Top
21 楼taodm((不能收CSDN社区短信息,请莫浪费精力))回复于 2006-10-31 15:55:29 得分 0
li01bin(啊!斌)是学院派的吧。
new如果失败,是直接抛异常的,根本不会给你做if (!= NULL)判断的机会的。
delete对于0是完全正确地接受的,不需要做这个额外判断的。Top
22 楼zwh37333()回复于 2006-10-31 19:13:30 得分 10
兄弟,你的分配内存和释放没有问题,在这其中你的操作可能是访问越界,写入了该分配空间之外,而且是下界超限,破坏了空间大小信息。Top




