其原因可能是堆被损坏,这说明.exe 中或它所加载的任何 DLL 中有 Bug。

wozuiqiangdeaoyi 2011-10-19 09:38:47
HANDLE textheap = HeapCreate(NULL,0,0);
HANDLE charheap = HeapCreate(NULL,0,0);
head = (text *)HeapAlloc(textheap,HEAP_ZERO_MEMORY,sizeof(text));
DWORD j=0,cc=0;

text *temp = (text *)HeapAlloc(textheap,HEAP_ZERO_MEMORY,sizeof(text));
head->next = temp;
for(i=0;p[i]!=EOF;i++)//p是整个txt内存里的首地址,用heapalloc申请。
{

for(;p[i]=='\n'&&p[i+1]!='\n';)
{temp->data = (char*)HeapAlloc(charheap,HEAP_ZERO_MEMORY,i-j+1);
cc = j;
for(DWORD c=0;c<(i-j);c++)
{
temp->data[c] = p[cc+1];
cc++;}
temp->data[cc+1] = '\0';j = i;
if(p[i+1]==EOF)
break;
text *tail = (text *)HeapAlloc(textheap,HEAP_ZERO_MEMORY,sizeof(text));
temp->next = tail;
tail->prev = temp;
temp = tail;
break;}
}

按照步骤调试过了,并不是立刻出现这个提示,而是调试到i = 90多,再次申请堆的时候出现这个提示。CreateHeap的时候第三个参数指定0不是确定这是个可以无限增大的堆了吗?
另外,我在用纯API写richEdit,感觉用链表来储存段太耗资源,用数组到后面插入光标确定行列修改什么的计算量超级大,各位有什么好逻辑么?
...全文
713 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wozuiqiangdeaoyi 2011-10-20
  • 打赏
  • 举报
回复
to gameslq:
我的程序里没有dll,那个文章里的第一个方法试了下,编译会爆link错误,其他的方法都是用在dll上的,我是exe。
to Kaile:
用new的话遇到超大文档就没有用了。
wozuiqiangdeaoyi 2011-10-20
  • 打赏
  • 举报
回复
擦,怎么还是没人?把代码改成这样解决了,似乎不是heapalloc的堆问题,似乎是栈的问题,求高人指点啊。

改后的代码:
for(;p[i]!=EOF && i<size-1;i++)
{

for(;p[i-1]=='\n'&&p[i]!='\n';)
{temp->data = (char*)HeapAlloc(charheap,HEAP_ZERO_MEMORY,i-j+1);
CopyMemory(temp->data,p+j,i-j);
temp->data[i-j] = '\0';j = i;

if(p[i+1]==EOF)
break;

temp->next = (text *)HeapAlloc(textheap,HEAP_ZERO_MEMORY,sizeof(text));
temp->next->prev = temp;
temp = temp->next;
break;}
}
wozuiqiangdeaoyi 2011-10-20
  • 打赏
  • 举报
回复
没有人吗?快来帮帮我呀。

我在反汇编调试了下,在终端出继续的话程序还是能执行,但是只能申请4个链表(不包括head),问题就在:
temp->data = (char*)HeapAlloc(charheap,HEAP_ZERO_MEMORY,i-j+1);
上面,i到第102个字节的时候,再次申请新的内存就不行了。
汇编的代码段是到int 3 那里终端,出现堆被破坏提示。

后来反复在别的地方修改,不出现终端提示了,但是内存依然只能申请到4快temp->data
Kaile 2011-10-19
  • 打赏
  • 举报
回复
用new看着舒服些, 这样比较晕
gameslq 2011-10-19
  • 打赏
  • 举报
回复
关于错误原因,参考下这个
http://blog.csdn.net/wangweitingaabbcc/article/details/6785815
wozuiqiangdeaoyi 2011-10-19
  • 打赏
  • 举报
回复
我认为你运算的那些 i-j+1 不够准,试试将这些数据用8的倍数对齐
————————
什么叫用8的倍数对齐,不懂?
i-j+1算法用new操作小数据除了第一行后面都是对的,第一行不对是因为dword j不能等于-1,第一次读取会从第二个字节开始读,因此英文正确而中文会出现错误的字符,用int等于-1就对了。
用户 昵称 2011-10-19
  • 打赏
  • 举报
回复
我认为你运算的那些 i-j+1 不够准,试试将这些数据用8的倍数对齐

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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