六、重学C++—深入探索new delete

发布于:2025-03-25 ⋅ 阅读:(36) ⋅ 点赞:(0)

上一章节:

五、重学C++—类(封装继承)-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/146458436?spm=1001.2014.3001.5502

本章节代码:

cppMemory.cpp

一、引言

在 C++ 中,new和delete是 动态内存管理的核心工具,掌握它们的原理对写出高效、稳定的代码至关重要。本文将围绕new和delete的定义、流程、重载等展开讲解。

二、new是什么?

1、new的定义

new,是C++中用于 堆上动态分配内存的运算符,new也是C++中的关键字。new在进行申请内存后,还会调用构造函数进行对象的初始化工作。

2、new的分类

2.1、 单个对象分配,new
/***
 *  C++ new /delete
 * 
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>

class Book { 
    std::string m_title; 
    int m_pages; 
public: 
    // 构造函数:初始化书籍信息 
    Book(std::string t, int p) { 
        m_title = t;
        m_pages = p;

        std::cout << "构造函数调用:"<<" 新书《" << m_title << "》诞生,共" << m_pages << "页" << std::endl; 
    } 
    Book(){
        std::cout << "构造函数调用" << std::endl;
    }
    ~Book(){
        std::cout << "析构函数调用" << std::endl;
    }
}; 

int main()
{
    Book* pbook = new Book; // 分配内存 + 调用构造函数  
    return 0;
}
2.2、数组对象的分配
Book* pArrBook = new Book[3]; // 分配3个Book对象的内存,调用3次构造函数  

2.3、定位 new(placement new) :在指定内存位置构造对象。
    char buffer[sizeof(Book)];  
    Book* p_placement = new(buffer)Book; // 在buffer内存位置构造Book对象  

三、new的工作流程

  1. 分配内存:通过operator new函数分配所需内存。这里内存大小,编译器根据数据类型,或者类的大小确定。
  2. 构造对象:调用对象的构造函数,完成初始化。
  3. 返回对象所对应的指针,无返回值类型

四、delete的定义

delete 用于释放new 分配的内存,它会 先调用对象的析构函数 再释放内存,将内存还给操作系统 。与new 对应,确保动态内存正确回收。

五、delete的工作流程

  1. 调用析构函数:清理对象资源。
  2. 释放内存:通过operator delete函数释放内存。

六、new/delete的重载

new/delete,属于运算符, 两者都可以重载;
自定义new delete 可优化内存管理(如内存池)
实例代码
 
class Blanks
{
    char m_c;
    int m_a;
    double m_d;
public:
    Blanks(){
        std::cout << "Blanks 构造函数调用" << std::endl;
        std::cout << "Blanks m_c:" << m_c<<std::endl;
    }
    ~Blanks(){
        std::cout << "Blanks 析构函数调用" << std::endl;
    }
    void *operator new( size_t stAllocateBlock, char chInit );

    oid operator delete(void* ptr);
};

void *Blanks::operator new( size_t stAllocateBlock, char chInit )
{
    // 编译器根据类大小,默认传入值;
    void *pvTemp = malloc( stAllocateBlock );
    std::cout << "Blanks Size:" << stAllocateBlock <<std::endl;
    if( pvTemp != 0 )
        memset( pvTemp, chInit, stAllocateBlock );
    return pvTemp;
}

void Blanks::operator delete(void* ptr) {  
    std::free(ptr);  
    std::cout << "Blanks 自定义delete释放内存" << std::endl;  
}  
int main()
{
    Blanks *a5 = new('a') Blanks;
    delete a5;
    return 0;
}
运行结果:

七、总结

  • new负责动态分配内存 + 构造对象,delete负责析构对象 + 释放内存。
  • 普通new/delete、数组new/delete、定位new需匹配使用。
  • 重载new/delete可定制内存管理策略,提升性能。掌握这些知识,能更精准地控制内存,避免泄漏,写出更健壮的 C++ 代码。