BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #36340同步于 2010/3/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

想问一个动态指针的问题

MZYX
2010/3/6镜像同步10 回复
程序里有一条这样的语句 bool *U1 = new bool[t-1]; 其中t是一个int型变量,从1到N,我调试发现,t=1是这条语句没有问题,并且U1也被分到了地址,但是t=2时,windows会弹出下面的警告: Windows has triggered a breakpoint in XXX.exe. This may be due to a corruption of the heap, and indicates a bug in XXX.exe or any of the DLLs it has loaded. The output window may have more diagnostic information 这时候程序调到 extern "C" _CRTIMP void __cdecl _free_dbg( void * pUserData, int nBlockUse ) { /* lock the heap */ _mlock(_HEAP_LOCK); __try { /* allocate the block */ _free_dbg_nolock(pUserData, nBlockUse); } =》__finally { /* unlock the heap */ _munlock(_HEAP_LOCK); } } 不清楚到底是什么问题 谢谢
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
jmpesp机器人#1 · 2010/3/6
i try it in vc6, and it's no problem. what environment you have developed in?
MZYX机器人#2 · 2010/3/6
我用的是VC2005,我以前也是用vc6,所以对vc2005还是不太熟悉,thanks a lot
AHU机器人#3 · 2010/3/6
我这跑也没问题,全是TRUE 【 在 MZYX 的大作中提到: 】 : 程序里有一条这样的语句 : bool *U1 = new bool[t-1]; : 其中t是一个int型变量,从1到N,我调试发现,t=1是这条语句没有问题,并且U1也被分到了地址,但是t=2时,windows会弹出下面的警告: : ...................
vi机器人#4 · 2010/3/6
使用 type* p=new type[n] 这样的语句,某些编译器,包括vc2005,会在堆中分配 n*sizeof(type)+4个字节,p指向 4号字节。0-3号字节中存放着n。 那么,bool *U1=new bool[t-1]; 这种代码在t=1时执行成功后,U1指向的是什么? 看错误警告,应该是在释放内存时出的错误。也许与此有关。 【 在 MZYX 的大作中提到: 】 : 程序里有一条这样的语句 : bool *U1 = new bool[t-1]; : 其中t是一个int型变量,从1到N,我调试发现,t=1是这条语句没有问题,并且U1也被分到了地址,但是t=2时,windows会弹出下面的警告: : ...................
MZYX机器人#5 · 2010/3/6
t=1时,会给U1分配地址0X003b660,释放内存时,没有错误或是警告,但是U1没有被释放掉,仍然指向0X003b660,当子函数(U1在这个子函数里)在次被调用是,U1有地址为0Xccccccc,然后在给U1分配地址是出错了,难道是U1没有被释放掉的原因吗?type* p=new type[0],那p到底是什么呢?我试试,当t=1时,把U1赋值为空指针。谢谢大家热情帮助哈!
tb01070机器人#6 · 2010/3/6
我在vc++6.0上通过了编译,VS2008编译如图
MZYX机器人#7 · 2010/3/6
我大概知道是哪里错了,估计是我删除指针的时候删除了两次,如果有两个动态指针指向同一块数据,那么删除的时候是删除其中任意一个,还是两个都删呢?
jokerlee机器人#8 · 2010/3/7
【 在 MZYX 的大作中提到: 】 : t=1时,会给U1分配地址0X003b660,释放内存时,没有错误或是警告,但是U1没有被释放掉,仍然指向0X003b660,当子函数(U1在这个子函数里)在次被调用是,U1有地址为0Xccccccc,然后在给U1分配地址是出错了,难道是U1没有被释放掉的原因吗?type* p=new type[0],那p到底是什么呢?我试试,当t=1时,把U1赋值为空指针。谢谢大家热情帮助哈! free一个指针并不一定改变指针的值,所以不能通过指针的值是否改变来判断内存是否释放
jokerlee机器人#9 · 2010/3/7
【 在 MZYX 的大作中提到: 】 : 我大概知道是哪里错了,估计是我删除指针的时候删除了两次,如果有两个动态指针指向同一块数据,那么删除的时候是删除其中任意一个,还是两个都删呢? 同一片内存只能释放一次,无论有多少个指针指向它