c++ new 和 malloc 分配内存

创建一个类

cpp 复制代码
class Test {
public:
    Test() { std::cout << "constructor"; }
    virtual ~Test() {}

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

private:
    int a = 10;
};

main函数

cpp 复制代码
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;
}

输出

bash 复制代码
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修改一下

bash 复制代码
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函数

cpp 复制代码
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;
}

输出

bash 复制代码
class size: 16 
constructor 
a: 10 
constructor 
a: 20 
destructor, a:  10 
destructor, a:  20 
free(): invalid pointer
Aborted (core dumped)
相关推荐
杨小码不BUG23 分钟前
蛇形舞动:矩阵填充的艺术与算法(洛谷P5731)
c++·算法·矩阵·csp-j/s·循环控制
草莓熊Lotso1 小时前
《C++ STL list 完全指南:从基础操作到特性对比,解锁链表容器高效用法》
开发语言·c++·list
繁星星繁2 小时前
C++11学习笔记
c++·笔记·学习
Stanford_11067 小时前
如何利用Python进行数据分析与可视化的具体操作指南
开发语言·c++·python·微信小程序·微信公众平台·twitter·微信开放平台
千里马-horse8 小时前
Async++ 源码分析8--partitioner.h
开发语言·c++·async++·partitioner
Lucis__9 小时前
再探类&对象——C++入门进阶
开发语言·c++
北京不会遇到西雅图10 小时前
【SLAM】【后端优化】不同优化方法对比
c++·机器人
jndingxin10 小时前
c++多线程(6)------ 条件变量
开发语言·c++
程序员莫小特11 小时前
老题新解|大整数加法
数据结构·c++·算法
洲覆12 小时前
C++ 模板、泛型与 auto 关键字
开发语言·数据结构·c++