当前位置: 首页 > article >正文

基础14 C++申请内存的各种方法

一、内存的手动申请与释放

🥦 malloc/free

void *p1 = malloc(sizeof(Test) * 10);
free(p1);
  • 这2个是c语言中的函数,malloc单纯的只是为了申请一块固定大小的内存,free只是单纯的为了将内存释放掉
  • free在内存释放的时候,并没有传入释放内存的大小,所以对于malloc来说它每次执行所有申请的堆内存一般会更大。至少要存一些申请了多少

🥝 new/delete

new 和 delete 是C++函数,所以内部要调用构造与析构

Test* p2=new Test();
// 等价
void* mem=operator new(sizeof(Test));
Test* p2=(Test*)mem;
p2->Test::Test();
delete p2;
// 等价
p2->~Test();
operator delete(p2);

🥑 placement new

placement new 需要传入一块分配好内存的指针,所以其本身不会额外申请内存空间

Test* p3=new(p1)Test();
// 等价
void* mem=operator new (sizeof(Test), p1);
Test*p3 = (Test*)mem;
p3->Test::Test();

二、完全掌控内存的申请与释放

#include <iostream>
#include <vector>
#include <string>

class Test
{
public:
    Test() { std::cout << "Test() addr is: " << this << std::endl; }
    Test(int a) : _a(a)
    {
        std::cout << "Test(int a) addr is: " << this << std::endl;
    }
    Test(int a, int b) { std::cout << "Test(int a, int b) addr is: " << this << std::endl; }
    ~Test() { std::cout << "~Test() addr is: " << this << std::endl; }

    void *operator new(size_t size)
    {
        std::cout << "operator new(size_t size)" << std::endl;
        return malloc(size);
    }

    void *operator new(size_t size, void *buf)
    {
        std::cout << "operator new(size_t size, void* buf)" << std::endl;
        return buf;
    }

    void operator delete(void *ptr, size_t size)
    {
        std::cout << "operator delete(void* ptr, size_t size)" << std::endl;
        free(ptr);
    }

    void operator delete(void *ptr, void *buf)
    {
        std::cout << "operator delete(void* ptr, void* buf)" << std::endl;
        free(ptr);
    }

private:
    int _a;
};

int main()
{
    // void *p1 = malloc(sizeof(Test) * 10);
    // free(p1);
    // int *p2 = (int *)malloc(sizeof(Test) * 10);
    // free((++p2)); // 会崩溃,因为p2指向别处,他就不知道应该释放多少堆内存啦

    Test *p3 = new Test();
    delete p3;

    std::cout<<"---------------------------"<<std::endl;

    void *buf = malloc(sizeof(Test));
    Test *p4 = new (buf) Test(500);
    delete p4; // 会调用operator delete(void* ptr)
    return 0;
}
operator new(size_t size)
Test() addr is: 0x555555769680
~Test() addr is: 0x555555769680
operator delete(void* ptr, size_t size)
---------------------------
operator new(size_t size, void* buf)
Test(int a) addr is: 0x555555769680
~Test() addr is: 0x555555769680
operator delete(void* ptr, size_t size)


http://www.kler.cn/a/461891.html

相关文章:

  • 【机器学习】【朴素贝叶斯分类器】从理论到实践:朴素贝叶斯分类器在垃圾短信过滤中的应用
  • 信息科技伦理与道德1:研究方法
  • Codigger集成Copilot:智能编程助手
  • 【深度学习进阶】基于CNN的猫狗图片分类项目
  • TVS二极管选型【EMC】
  • 【AI】最近有款毛茸茸AI生成图片圈粉了,博主也尝试使用风格转换生成可爱的小兔子,一起来探索下是如何实现的
  • 自动化测试的心得
  • Singleton: WebRTC中ThreadManager中的单例模式
  • [创业之路-231]:《华为闭环战略管理》-5-企业组织架构、业务架构、技术架构、产品架构等它们有哪些不同的地方,又有哪些是相同的?
  • 数据库的使用09:使用SSMS工具将SQLsever数据导出到Excel
  • 【架构-38】如何选择通信协议和数据格式
  • 视频智能翻译
  • Java List 源码解析——从基础到深度剖析
  • Postman[2] 入门——界面介绍
  • 赛博周刊·2024年度工具精选(图片设计类)
  • 基于STM32的智能床垫控制系统的Proteus仿真
  • 直流开关电源技术及应用二
  • 麒麟信安云在长沙某银行的应用入选“云建设与应用领航计划(2024)”,打造湖湘金融云化升级优质范本
  • python ai ReAct 代理(ReAct Agent)
  • ulimit命令与nginx的联系
  • 【Linux报告】实训六 重置超级用户密码
  • Docker--Docker Network(网络)
  • Java:认识异常(超详解)
  • Springboot项目:使用MockMvc测试get和post接口(含单个和多个请求参数场景)
  • datax与sqoop的优缺点?
  • 安全见闻(一)