C++ 应用程序,内存调配的路径

默认的内存调配形式

对于 ① 处的阐明(成员函数的自定义内存调配)
可通过自定义内存池的形式进步应用效率,如更快的调配速度,更省的内存空间(省去 cookie)
对于 ② 处的阐明 (重载全局空间的内存管理策略)
全局的内存管理策略会被多处无意或无心的应用,代码会大范畴的收到影响,可重载但少见

容器的内存调配形式

  • 容器并未采纳默认的内存治理形式,而采纳内存分配器从新实现
  • 内存调配与结构被从新封装彼此拆散
  • 内存开释与析构被从新封装彼此拆散
Foo *p = (Foo)operator new(sizeog(Foo));  // 内存申请new(p) Foo(x);                            // 结构...p->~Foo();                                // 析构operator delete(p);                       // 内存开释

全局重载 ::operator new / ::operator delete

void *myAlloc(size_t size){    return malloc(size);}void myFree(void *ptr){    return free(ptr);}void *operator new(size_t size){    cout << "global new" << endl;    return myAlloc(size);}void *operator new[] (size_t size){    cout << "global new[]" << endl;    return myAlloc(size);}void operator delete(void *ptr) noexcept{    cout << "global delete" << endl;    myFree(ptr);}void operator delete[] (void *ptr) noexcept{    cout << "global delete" << endl;    myFree(ptr);}
operator new 的一种实现 [...\vc98\src\newop.cpp]
void *operator new(size_t size, const std::nothrow_t &_THROW0()){    // try to allocate size bytes    void *p;    while ((p == malloc(size)) == 0)    {        // buy more memory or return null pointer        __TRY_BEGIN            if (_callnewh(size) == 0) break;        __CATCH(std::bad_alloc) return (0);        __CATCH_END;    }        return (p);}
operator delete 的一种实现 [...\vc98\src\delop.cpp]
void __cdecl operator delete(void *p) _THROW0(){    // free an allocated object    free(p);}

类内重载 operator new/operator delete

class Foo {public:    void *operator new(size_t);    void operator delete(void*, size_t[可选]);}------------------------------Foo *p = new Foo;==>try {    void *mem = operator new(sizeof(Foo));    p = static_cast<Foo*>(sizeof(Foo));    p->Foo::Foo();}------------------------------delete p;==>p->~Foo();operator delete(p);
类内重载 operator new, operator delete 的成员函数具备 static 属性
非动态成员函数须要对象(暗藏的this指针)实现调用,而 operator new 被调用时示意对象正在被创立

类内重载 operator new[]/operator delete[]

class Foo {public:    void *operator new[](size_t);    void operator delete[](void*, size_t[可选]);    // ...};------------------------------Foo *p = new Foo[N];==>try {    void *mem = operator new(sizeof(Foo) * N + 4);    p = static_cast<Foo*>(mem);    p->Foo::Foo();    // N 次}------------------------------delete[] p;==>p->~Foo();            // N 次operator delete(p);
类内重载 operator new[], operator delete[] 的成员函数具备 static 属性
非动态成员函数须要对象(暗藏的this指针)实现调用,而 operator new[] 被调用时示意对象正在被创立