C++ memory primitives(原语)new若malloc失败会调用 int _callnewh(size_t t); 即调用用户设定的handler(回调函数指针),可用于内存回收防止泄露。operator new 和 new operator的区别new operator 是 分配内存...

-
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)


- ubuntu下C/C++获取剩余内存 2023-09-18
- Easyx实现扫雷游戏 2023-02-06
- C语言详解float类型在内存中的存储方式 2023-03-27
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- Qt计时器使用方法详解 2023-05-30
- C语言qsort()函数的使用方法详解 2023-04-26
- C++ 数据结构超详细讲解顺序表 2023-03-25
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- C语言手把手带你掌握带头双向循环链表 2023-04-03