能否释放堆里的某段内存想请教下,操作系统是如何识别某一点内存是堆得,是通过申请的时候记录堆的首地址指
能否释放堆里的某段内存
想请教下,操作系统是如何识别某一点内存是堆得,是通过申请的时候记录堆的首地址指针的吗?
那么我如果想单独释放堆里的某一段内存,那么操作系统是否识别我要释放的内存的指针?
举个例子,P* p = new P; ,Object a 是P的一个成员变量,那么我能都单独释放a呢,虽然这么写不符合C++的RAII(是这个规则吗,忘了),但想确认下能都这么写。
Class P
{
Object a;
}
P* p = new P
delete &(p->a);
大致逻辑是这个样子,表述可能不符合规范这些暂时不考虑吧。大家应该能看懂我的意思了。还请不吝赐教。
[解决办法]只能 delete p;
[解决办法]这个操作肯定是不合法的,new和delete没有匹配,加之,从逻辑来讲,类成员释放之后,类本身并没有释放,这样会造成逻辑错误
[解决办法]void operator delete(
void *pUserData
)
{
_CrtMemBlockHeader * pHead;
RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
if (pUserData == NULL)
return;
_mlock(_HEAP_LOCK); /* block other threads */
__TRY
/* get a pointer to memory block header */
pHead = pHdr(pUserData); //从哪个地址开始分配,释放也从这个地址开始。
/* verify block type */
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
_free_dbg( pUserData, pHead->nBlockUse );
__FINALLY
_munlock(_HEAP_LOCK); /* release other threads */
__END_TRY_FINALLY
return;
}
[解决办法]是通过地址,你的例子碰巧a和p的地址相同,内存正确释放与否取决于编译器实现,析构函数必然出错
[解决办法]不可以的!因为每一次分配新空间的时候都会有释放的时候结束符的!
如果你破坏了,后果就不可猜想了
[解决办法]举个例子,P* p = new P; ,Object a 是P的一个成员变量,那么我能都单独释放a呢
不可以,new 或alloc等函数获得的内存由内存管理器进行管理,new到的内存是一个整体(new到的内存可能会比实际给定的数量大,因为内存是按一定的块大小分配),只能通过new到的指针进行删除