首页 > 编程语言 > 详细

[ C++ ] 勿在浮沙筑高台 —— 内存管理(1~8p)

时间:2020-05-19 20:02:38      阅读:46      评论:0      收藏:0      [点我收藏+]
  • C++ memory primitives(原语)

    技术分享图片

  • new

    技术分享图片
    技术分享图片

    若malloc失败会调用 int _callnewh(size_t t); 即调用用户设定的handler(回调函数指针),可用于内存回收防止泄露。

  • operator new 和 new operator的区别

    new operator 是 分配内存+调用构造函数初始化
    operator new 是 new operator操作的一部分,它只负责分配内存,它对构造函数一无所知!
    一般长这样

        void * operator new(size_t size);
    

    返回一个raw指针。
    你可以重载多个参数的operator new ,但第一个参数必须是 size_t类型;

  • delete

    技术分享图片

  • Ctor & Dtor的直接调用

    Ctor不能直接调。。除非用placement new;

    new(p)Constructor(xxx);
    

    Dtor倒是可以直接调,似乎和普通的成员函数一样;

  • array new ,array delete

    对class without ptr member通常无影响:因为析构函数没啥用(注意free 这里能通过new的cookie头识别要释放多少块,所以不影响)
    对class with ptr member通常影响大:因为除了第一个元素,其它元素的析构函数没有被调用,块内指针分配的内存没有被free,造成内存泄漏。
    如果class的析构函数是non trivial直接暴毙,简要来说是因为
    技术分享图片

    原本对象数组指针p指向0x00481c34, operater delete[] 会将其修改至new cookie的位置,即0x00481c30。 free时发现 分配的内存结构被破坏了(或是位置不对?),gg。
    如果是trivial的当然不影响,因为没有new cookie,自然也不会修改p指针。

    注意array delete 析构函数的调用是逆序的!

  • placement new

    placement new 根本不分配内存,所以没有placement delete这一说。

  • 骚操作

    成员函数中调用delete this,使用堆上的对象调用相应函数。
    普通函数一般无事,只是对象被析构;析构函数无限递归直接gg。

[ C++ ] 勿在浮沙筑高台 —— 内存管理(1~8p)

原文:https://www.cnblogs.com/Cha2azzZ/p/12918820.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!