c++控制内存分配

Posted likemao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++控制内存分配相关的知识,希望对你有一定的参考价值。

为了满足应用程序对内存分配的特殊需求,C++允许重载new运算符和delete运算符控制内存分配,通过定位new表达式初始化对象(好处是可以在某些场景下避免重新内存分配的消耗)

 

1、operate new /delete

#include "QtGuiApplication2.h"

class A

public:
    A():m_i(0)
    A(int i):m_i(i)
    ~A()
    void* operator new(size_t st) noexcept
    
        if (void *mem = malloc(st))
        
            return mem;
        

        return nullptr;
    
    void operator delete(void *mem) noexcept
    
        free(mem);
    
private:
    int m_i;
;

QtGuiApplication2::QtGuiApplication2(QWidget *parent)
    : QMainWindow(parent)

    ui.setupUi(this);
    A* a = new A(3);//new表达式走了3步:1、调用operate new分配内存 2、调用构造函数 3、返回一个A对象指针
  delete a;//delete表达式走了2步:1、调用析构函数 2、释放空间

 

2、定位new表达式什么时候需要呢

#include "QtGuiApplication2.h"

class A

public:
    A():m_i(0)
    A(int i):m_i(i)
    ~A()
    void* operator new(size_t st) noexcept
    
        if (void *mem = malloc(st))
        
            return mem;
        

        return nullptr;
    
    void operator delete(void *mem) noexcept
    
        free(mem);
    
private:
    int m_i;
;

QtGuiApplication2::QtGuiApplication2(QWidget *parent)
    : QMainWindow(parent)

    ui.setupUi(this);
    void* a = A::operator new(sizeof(A));
    for (int i = 0; i < 1000; ++i)
    
        A* placement = ::new (a) A(i);
        //dosomething to placement...
        placement->~A();
    
    A::operator delete(a);

假设在1000次循环中就可以省去每次分配和释放内存空间的消耗了

定位new的形式:

new (place_address) type
new (place_address) type (initializers)
new (place_address) type [size]
new (place_address) type [size] braced initializer list

 

总结:

重载new和delete可以自定义内存分配方式,而定位new表达式则提供构造对象的途径(记得给place_address传一个分配好空间的void指针才行哦)

 

以上是关于c++控制内存分配的主要内容,如果未能解决你的问题,请参考以下文章

C++ Primer 5th笔记(chap 19 特殊工具与技术)控制内存分配

C++中内存分配问题

C++内存分配及变长数组的动态分配

c++内存分配

在 C++ 中的 2D 动态内存分配数组中释放分配的内存

动态内存分配(c++)