加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c++控制内存分配

发布时间:2020-12-16 09:18:09 所属栏目:百科 来源:网络整理
导读:为了满足应用程序对内存分配的特殊需求,C++允许重载new运算符和delete运算符控制内存分配,通过定位new表达式初始化对象(好处是可以在某些场景下避免重新内存分配的消耗) ? 1、operate new /delete #include " QtGuiApplication2.h " class A{ public : A

为了满足应用程序对内存分配的特殊需求,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指针才行哦)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读