专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C++

可否释放堆里的某段内存

发布时间:2011-06-28 14:03:24 文章来源:www.iduyao.cn 采编人员:星星草
能否释放堆里的某段内存
想请教下,操作系统是如何识别某一点内存是堆得,是通过申请的时候记录堆的首地址指针的吗?
那么我如果想单独释放堆里的某一段内存,那么操作系统是否识别我要释放的内存的指针?
举个例子,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到的指针进行删除
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: