谁遇到过这样的错误???????

时间:2021-01-17 20:08:22
谁遇到过这样的错误???????

HEAP[Server.exe]: HEAP: Free Heap block 25c5078 modified at 25c5514 after it was freed


@^@
~~~

19 个解决方案

#1


太奇怪了,可以附上相关的代码吗?

#2


没见过.
把debug目录删了看看。

#3


在堆内存操作失误。估计应该是你在释放了堆上的内存后又继续向那里写了些什么。 是不是用了WIN API HEAP 类函数,象LocalAlloc 或heapAlloc()等等 。

#4


内存操作错误

#5


没有代码难判断那里出错。但肯定的是内存出错,按照英文说象是delete后或free后再操作而出错。
Server.exe?太像木马的客户端程序了!?

#6


Is it an out of bound error?

#7


对已释放的内存进行违规操作!

#8


是的,是对释放的内存进行操作,
如:
char*   p = new char[1000];
delete[] p;
strcpy( p, "就会出错!" );

怎样知道这个内存已经被释放了?

#9


注:以上代码如被用了一遍(第一次不出错),别人地方再New就会出出错,
如:
char*   p = new char[1000];
delete[] p;
strcpy( p, "Bug我找不到" );      // 不报错
...
char* b = new char[1000];      // new 时会失败(我不知道在哪对已释放的内存进行违规操作)

#10


在编程中如果有良好的习惯就不会产生这类错误:

char*   p = new char[1000];
delete[] p;
p=NULL;


strcpy( p, "就会出错!" );

当你delete了一个指针后,立即将此指针赋值为NULL.

#11


上面所说的是 在释放了堆内存后还修改内存中的内容

#12


肯能需要全部重新编译

#13


Zark(金陵五月) :

delete[] p;
p=NULL;

这两个操作有什么区别呢?平时我们就执行了第一条啊。

#14


上一个对于数组操作,必须添加[]
地下的一般操作

#15


我见过这样的问题,就是内存管理的问题,比如数组下标越界.
delete[] p;只是将p指向的内存空间的使用权还给系统,而P作为一个变量,本身存储的值没变,只不过现在是一个无效地址了,变成了野指针,所以执行完
delete后,要把p变为NULL.

#16


如果有了
p=NULL;
这一句,则你无法执行下面的一句
strcpy(p,"....");
会出错的.这样强行地促使错误表面化,比出现楼主所说的这类令人迷惑的问题在程序维护上要容易得多.

#17


但如果有下面的问题,给赋NULL也没用
如:
char*   p = new char[981];
...
...
char*   b = p;
...            // 对b进行操作
delete[] b;    // 用完后以为没用了,则释放了它
b = NULL;
...
if ( p != NULL )
   strcpy( p, "这时不知道p已被释放了" );

====================
有一个现像:
就是当new char[N];  // N<=980时没问题,大于980就有new的问题(我用是的Windown2000Professional+VC6.0)

#18


gz

#19


的确如此.如果有两个指针指向同一堆内存,其出错的可能性和隐蔽性都会更大,我的这个方法只是一个编程风格意义上的解决方法,是不能完全杜绝出错的.对堆内存的操作是程序员自己负责的事情,首先必须认真仔细地思考,而不能依赖于某种外部解决方法.

不过仍有大量的解决方法可供用,如果你学过COM,那么你可能就会知道smart pointer一说,虽然那是用来解决ptr->release()的问题的,但你可以借用其思想.

================
我没有碰到你所说的n>980的问题,我曾经用过
char* pszText=new char[1024*8];
没有出过问题.

#1


太奇怪了,可以附上相关的代码吗?

#2


没见过.
把debug目录删了看看。

#3


在堆内存操作失误。估计应该是你在释放了堆上的内存后又继续向那里写了些什么。 是不是用了WIN API HEAP 类函数,象LocalAlloc 或heapAlloc()等等 。

#4


内存操作错误

#5


没有代码难判断那里出错。但肯定的是内存出错,按照英文说象是delete后或free后再操作而出错。
Server.exe?太像木马的客户端程序了!?

#6


Is it an out of bound error?

#7


对已释放的内存进行违规操作!

#8


是的,是对释放的内存进行操作,
如:
char*   p = new char[1000];
delete[] p;
strcpy( p, "就会出错!" );

怎样知道这个内存已经被释放了?

#9


注:以上代码如被用了一遍(第一次不出错),别人地方再New就会出出错,
如:
char*   p = new char[1000];
delete[] p;
strcpy( p, "Bug我找不到" );      // 不报错
...
char* b = new char[1000];      // new 时会失败(我不知道在哪对已释放的内存进行违规操作)

#10


在编程中如果有良好的习惯就不会产生这类错误:

char*   p = new char[1000];
delete[] p;
p=NULL;


strcpy( p, "就会出错!" );

当你delete了一个指针后,立即将此指针赋值为NULL.

#11


上面所说的是 在释放了堆内存后还修改内存中的内容

#12


肯能需要全部重新编译

#13


Zark(金陵五月) :

delete[] p;
p=NULL;

这两个操作有什么区别呢?平时我们就执行了第一条啊。

#14


上一个对于数组操作,必须添加[]
地下的一般操作

#15


我见过这样的问题,就是内存管理的问题,比如数组下标越界.
delete[] p;只是将p指向的内存空间的使用权还给系统,而P作为一个变量,本身存储的值没变,只不过现在是一个无效地址了,变成了野指针,所以执行完
delete后,要把p变为NULL.

#16


如果有了
p=NULL;
这一句,则你无法执行下面的一句
strcpy(p,"....");
会出错的.这样强行地促使错误表面化,比出现楼主所说的这类令人迷惑的问题在程序维护上要容易得多.

#17


但如果有下面的问题,给赋NULL也没用
如:
char*   p = new char[981];
...
...
char*   b = p;
...            // 对b进行操作
delete[] b;    // 用完后以为没用了,则释放了它
b = NULL;
...
if ( p != NULL )
   strcpy( p, "这时不知道p已被释放了" );

====================
有一个现像:
就是当new char[N];  // N<=980时没问题,大于980就有new的问题(我用是的Windown2000Professional+VC6.0)

#18


gz

#19


的确如此.如果有两个指针指向同一堆内存,其出错的可能性和隐蔽性都会更大,我的这个方法只是一个编程风格意义上的解决方法,是不能完全杜绝出错的.对堆内存的操作是程序员自己负责的事情,首先必须认真仔细地思考,而不能依赖于某种外部解决方法.

不过仍有大量的解决方法可供用,如果你学过COM,那么你可能就会知道smart pointer一说,虽然那是用来解决ptr->release()的问题的,但你可以借用其思想.

================
我没有碰到你所说的n>980的问题,我曾经用过
char* pszText=new char[1024*8];
没有出过问题.

#20