c++ new 和 malloc 分配内存

创建一个类

class Test {
public:
    Test() { std::cout << "constructor"; }
    virtual ~Test() {}

    void print() { std::cout << "a:" << a; }

private:
    int a = 10;
};

main函数

int main(int argv, char **args)
{
    std::cout << "class size:" << sizeof(Test);
    void *ptr = ::malloc(sizeof(Test));

    std::cout << "new class";
    new (ptr) Test;
    
    std::cout << "convert";
    Test *test = (Test *)ptr;
    test->print();

    delete test;
    ::free(ptr);
    return 0;
}

输出

class size: 16 
new class 
constructor 
convert
a: 10 
free(): double free detected in tcache 2
Aborted (core dumped)

这里例子通过malloc分配了 class Test需要的内存空间
new (ptr) Test实际上就是将ptr内存分配给了class Test
可以看到调用了new (ptr) Test后, 就调用了class Test的构造函数

通过 Test *test = (Test *)ptr
ptr转换class Test
就可以调用class Test的函数

最后可以看到当调用delete test后再调用::free(ptr)
就触发了
free(): double free detected in tcache 2
Aborted (core dumped)

所以ptrclass Test访问的都是同一块内存

这就是内存池一个大致的原理
通过预先申请一块, 每当new的时候, 就是将预先申请的内存分配给class
delete的时候, 只是程序回收了这个内存块, 不是返还给系统

再看一个例子, 将class修改一下

class Test {
public:
    Test(int _A) : a(_A) { std::cout << "constructor"; }
    virtual ~Test() { std::cout << "destructor, a: " << a; }
    void print() { std::cout << "a:" << a; }

private:
    int a;
};

main函数

int main(int argv, char **args)
{
    std::cout << "class size:" << sizeof(Test);
    void *ptr = ::malloc(sizeof(Test) * 10);

    new (ptr) Test(10);
    Test *test = (Test *)ptr;
    test->print();

    new ((void *)((Test *)ptr + sizeof(Test))) Test(20);
    Test *test2 = ((Test *)ptr + sizeof(Test));
    test2->print();

    delete test;
    delete test2;
    ::free(ptr);
    return 0;
}

输出

class size: 16 
constructor 
a: 10 
constructor 
a: 20 
destructor, a:  10 
destructor, a:  20 
free(): invalid pointer
Aborted (core dumped)

相关推荐

  1. c++ new malloc 分配

    2024-06-08 14:12:06       36 阅读
  2. 分区

    2024-06-08 14:12:06       40 阅读
  3. c++ 动态分配

    2024-06-08 14:12:06       37 阅读
  4. C# 分配管理

    2024-06-08 14:12:06       56 阅读
  5. 栈内存

    2024-06-08 14:12:06       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-08 14:12:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-08 14:12:06       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-08 14:12:06       82 阅读
  4. Python语言-面向对象

    2024-06-08 14:12:06       91 阅读

热门阅读

  1. SREC用什么软件编程:全面解析与编程工具选择

    2024-06-08 14:12:06       30 阅读
  2. Redis基础:在现代架构中使用Redis的优势与挑战

    2024-06-08 14:12:06       29 阅读
  3. 【React】Lodash

    2024-06-08 14:12:06       31 阅读
  4. 【C#】C#读写Excel文件

    2024-06-08 14:12:06       31 阅读
  5. mysql centos xtrabackup

    2024-06-08 14:12:06       32 阅读
  6. UG数控编程入门:从基础到精通的全方位指南

    2024-06-08 14:12:06       33 阅读
  7. 用FFMPEG对YUV序列进行编辑的笔记

    2024-06-08 14:12:06       28 阅读
  8. 【RabbitMQ】exchange\channel\queue的联系

    2024-06-08 14:12:06       31 阅读
  9. 骑砍2霸主MOD开发(14)-进击的巨人

    2024-06-08 14:12:06       35 阅读
  10. 详解MySQL的MVCC机制

    2024-06-08 14:12:06       35 阅读
  11. 正则限制字符串的长度必须是n的倍数

    2024-06-08 14:12:06       30 阅读
  12. 解释Hibernate框架的作用和与JDBC的区别

    2024-06-08 14:12:06       31 阅读