HEAP[Server.exe]: HEAP: Free Heap block 25c5078 modified at 25c5514 after it was freed
@^@
~~~
19 个解决方案
#1
太奇怪了,可以附上相关的代码吗?
#2
没见过.
把debug目录删了看看。
把debug目录删了看看。
#3
在堆内存操作失误。估计应该是你在释放了堆上的内存后又继续向那里写了些什么。 是不是用了WIN API HEAP 类函数,象LocalAlloc 或heapAlloc()等等 。
#4
内存操作错误
#5
没有代码难判断那里出错。但肯定的是内存出错,按照英文说象是delete后或free后再操作而出错。
Server.exe?太像木马的客户端程序了!?
Server.exe?太像木马的客户端程序了!?
#6
Is it an out of bound error?
#7
对已释放的内存进行违规操作!
#8
是的,是对释放的内存进行操作,
如:
char* p = new char[1000];
delete[] p;
strcpy( p, "就会出错!" );
怎样知道这个内存已经被释放了?
如:
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 时会失败(我不知道在哪对已释放的内存进行违规操作)
如:
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.
char* p = new char[1000];
delete[] p;
p=NULL;
strcpy( p, "就会出错!" );
当你delete了一个指针后,立即将此指针赋值为NULL.
#11
上面所说的是 在释放了堆内存后还修改内存中的内容
#12
肯能需要全部重新编译
#13
Zark(金陵五月) :
delete[] p;
p=NULL;
这两个操作有什么区别呢?平时我们就执行了第一条啊。
delete[] p;
p=NULL;
这两个操作有什么区别呢?平时我们就执行了第一条啊。
#14
上一个对于数组操作,必须添加[]
地下的一般操作
地下的一般操作
#15
我见过这样的问题,就是内存管理的问题,比如数组下标越界.
delete[] p;只是将p指向的内存空间的使用权还给系统,而P作为一个变量,本身存储的值没变,只不过现在是一个无效地址了,变成了野指针,所以执行完
delete后,要把p变为NULL.
delete[] p;只是将p指向的内存空间的使用权还给系统,而P作为一个变量,本身存储的值没变,只不过现在是一个无效地址了,变成了野指针,所以执行完
delete后,要把p变为NULL.
#16
如果有了
p=NULL;
这一句,则你无法执行下面的一句
strcpy(p,"....");
会出错的.这样强行地促使错误表面化,比出现楼主所说的这类令人迷惑的问题在程序维护上要容易得多.
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)
如:
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];
没有出过问题.
不过仍有大量的解决方法可供用,如果你学过COM,那么你可能就会知道smart pointer一说,虽然那是用来解决ptr->release()的问题的,但你可以借用其思想.
================
我没有碰到你所说的n>980的问题,我曾经用过
char* pszText=new char[1024*8];
没有出过问题.
#20
#1
太奇怪了,可以附上相关的代码吗?
#2
没见过.
把debug目录删了看看。
把debug目录删了看看。
#3
在堆内存操作失误。估计应该是你在释放了堆上的内存后又继续向那里写了些什么。 是不是用了WIN API HEAP 类函数,象LocalAlloc 或heapAlloc()等等 。
#4
内存操作错误
#5
没有代码难判断那里出错。但肯定的是内存出错,按照英文说象是delete后或free后再操作而出错。
Server.exe?太像木马的客户端程序了!?
Server.exe?太像木马的客户端程序了!?
#6
Is it an out of bound error?
#7
对已释放的内存进行违规操作!
#8
是的,是对释放的内存进行操作,
如:
char* p = new char[1000];
delete[] p;
strcpy( p, "就会出错!" );
怎样知道这个内存已经被释放了?
如:
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 时会失败(我不知道在哪对已释放的内存进行违规操作)
如:
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.
char* p = new char[1000];
delete[] p;
p=NULL;
strcpy( p, "就会出错!" );
当你delete了一个指针后,立即将此指针赋值为NULL.
#11
上面所说的是 在释放了堆内存后还修改内存中的内容
#12
肯能需要全部重新编译
#13
Zark(金陵五月) :
delete[] p;
p=NULL;
这两个操作有什么区别呢?平时我们就执行了第一条啊。
delete[] p;
p=NULL;
这两个操作有什么区别呢?平时我们就执行了第一条啊。
#14
上一个对于数组操作,必须添加[]
地下的一般操作
地下的一般操作
#15
我见过这样的问题,就是内存管理的问题,比如数组下标越界.
delete[] p;只是将p指向的内存空间的使用权还给系统,而P作为一个变量,本身存储的值没变,只不过现在是一个无效地址了,变成了野指针,所以执行完
delete后,要把p变为NULL.
delete[] p;只是将p指向的内存空间的使用权还给系统,而P作为一个变量,本身存储的值没变,只不过现在是一个无效地址了,变成了野指针,所以执行完
delete后,要把p变为NULL.
#16
如果有了
p=NULL;
这一句,则你无法执行下面的一句
strcpy(p,"....");
会出错的.这样强行地促使错误表面化,比出现楼主所说的这类令人迷惑的问题在程序维护上要容易得多.
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)
如:
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];
没有出过问题.
不过仍有大量的解决方法可供用,如果你学过COM,那么你可能就会知道smart pointer一说,虽然那是用来解决ptr->release()的问题的,但你可以借用其思想.
================
我没有碰到你所说的n>980的问题,我曾经用过
char* pszText=new char[1024*8];
没有出过问题.