首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

可否释放堆里的某段内存

2013-12-11 
能否释放堆里的某段内存想请教下,操作系统是如何识别某一点内存是堆得,是通过申请的时候记录堆的首地址指

能否释放堆里的某段内存
想请教下,操作系统是如何识别某一点内存是堆得,是通过申请的时候记录堆的首地址指针的吗?
那么我如果想单独释放堆里的某一段内存,那么操作系统是否识别我要释放的内存的指针?
举个例子,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到的指针进行删除

热点排行