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)
相关推荐
GG-_-Bond5 分钟前
9.1 kv存储内存池模拟面试问题
c++·c
AI吃大瓜9 分钟前
人脸检测和行人检测3:C/C++实现YOLOv8 YOLO11 YOLO26人脸检测和人体检测(含源码,可实时检测)
c++·yolov8·人脸检测·人体检测·yolo11·yolo26
Persistent的粽子!35 分钟前
C++的内存管理
c++·经验分享·笔记
hetao17338371 小时前
2026-09-13 hetao1733837 的刷题记录
c++·算法
hansang_IR1 小时前
【题解】[JSOI2016] 扭动的回文串
c++·算法
有点。1 小时前
C++03阶段练习(一)
数据结构·c++
刃神太酷啦1 小时前
Redis 核心进阶:哨兵、集群、缓存问题与分布式锁详解----《Hello Redis!》(6)
linux·c语言·数据库·c++·redis·分布式·缓存
郝学胜-神的一滴2 小时前
C++20模板元编程 01:从零吃透模板核心底层逻辑
开发语言·c++·vscode·程序人生·开源
6Hzlia2 小时前
【Classic 150 刷题计划】 LeetCode 123. 买卖股票的最佳时机 III | C++ 状态机动态规划与通用交易拓展
c++·算法·leetcode
luj_17682 小时前
生物体如何应对功能击穿?
c语言·开发语言·c++·经验分享·算法