7.1new 和 delete再了解7.2new细节探秘,重载类operator new delete

    xiaoxiao2024-01-01  148

    1.new内存分配细节探秘

    我们注意到,一块内存的回收,影响范围很广,远远不是10个字节,而是一大片。 分配内存这个事,绝不是简单的分配出去4个字节,而是在这4个字节周围,编译器做了很多处理,比如记录分配出去的字节数等等; 分配内存时,为了记录和管理分配出去的内存,额外多分配了不少内存,造成了浪费;尤其是你频繁的申请小块内存时,造成的浪费更明显,更严重,new ,delete(malloc,free)内存没有看上去那么简单,他们的工作内部是很复杂的;

    可以查看内存,观察内存的变化。

    namespace _nmsp1 //命名空间 { void func() { char *ppoint = new char[10]; memset(ppoint, 0, 10); delete[] ppoint; /* //测试程序 int *ppointint = new int(10); *ppointint = 2000000000; delete ppointint; */ } }

    2.重载类中的operator new和operator delete操作符

    namespace _nmsp2 //命名空间 { class A { public: static void *operator new(size_t size); //静态成员函数不占用类的内促 static void operator delete(void *phead); A() //自动调用 { int abc; abc = 10; } ~A() { int abc; abc = 1; } }; void *A::operator new(size_t size) { A *ppoint = (A *)malloc(size); return ppoint; } void A::operator delete(void *phead) { free(phead); } void func() { A *pa = ::new A(); //::全局操作符,这就会调用全局的new和delete ::delete pa; //::去掉就调用自己的operator new,operator delete } }

    3.重载类中的operator new[]和operator delete[]操作符

    namespace _nmsp3 { class A { public: static void *operator new[](size_t size); static void operator delete[](void *phead); A() { int abc; abc = 10; } ~A() { int abc; abc = 1; } }; void *A::operator new[](size_t size) //这个size是7个字节,另外四个字节是:记录数组的大小 { A *ppoint = (A *)malloc(size); return ppoint; } void A::operator delete[](void *phead) { free(phead); } void func() { A *pa = new A[3](); //构造和析构函数被调用3次,但是operator new[]和operator delete[]仅仅被调用一次; delete[] pa; } }

    最新回复(0)