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)
相关推荐
clint4564 天前
C++进阶(1)——前景提要
c++
夜悊5 天前
C++代码示例:进制数简单生成工具
c++
郝学胜_神的一滴5 天前
CMake 021: IF 条件判据详诠
c++·cmake
_wyt0015 天前
洛谷 B3930 [GESP202312 五级] 烹饪问题 题解
c++·gesp
玖玥拾5 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
один but you5 天前
constexpr函数
c++
凡人叶枫5 天前
Effective C++ 条款41:了解隐式接口和编译期多态
java·开发语言·c++·effective c++
凡人叶枫5 天前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++
小胖xiaopangss6 天前
BRpc使用
c++·rpc
-森屿安年-6 天前
63. 不同路径 II
c++·算法·动态规划