当前位置: 首页 > news >正文

C++中new和delete如何构建简单对象和复杂对象?

        在C++中,new 和 delete 操作符用于动态分配和释放内存。具体来说,它们可以用于构建简单对象(例如基本数据类型)和复杂对象(例如包含多个成员变量或自定义构造函数和析构函数的类对象)。

一、构建简单对象

1. 简单对象的分配和释放

        对于简单对象,例如基本数据类型(int、double 等),new 和 delete 非常直接。

简单对象的分配:
int* p = new int; // 分配一个int类型的内存并返回指针 
*p = 10; // 赋值
简单对象的释放:
delete p; // 释放之前分配的int类型内存

2. 数组的分配和释放

数组的分配:
int* arr = new int[10]; // 分配一个包含10个int类型元素的数组
数组的释放:
delete[] arr; // 释放之前分配的数组内存

二、构建复杂对象

1. 复杂对象的分配和释放

        对于复杂对象,例如类对象,new 和 delete 会调用构造函数和析构函数。

复杂对象的分配:
class MyClass {
public:
    MyClass() { /* 构造函数代码 */ }
    ~MyClass() { /* 析构函数代码 */ }
};

MyClass* obj = new MyClass;  // 分配MyClass对象并调用构造函数
复杂对象的释放:
delete obj; // 调用析构函数并释放内存

2. 数组的分配和释放

复杂对象数组的分配:
MyClass* arr = new MyClass[10]; // 分配一个包含10个MyClass对象的数组
复杂对象数组的释放:
delete[] arr; // 调用析构函数并释放数组内存

三、完整示例

为了更好地说明,下面是一个完整的示例,展示了如何使用 new 和 delete 来构建和释放简单对象和复杂对象:

#include 

class MyClass {
public:
    MyClass() {
        std::cout << "MyClass constructor called" << std::endl;
    }
    ~MyClass() {
        std::cout << "MyClass destructor called" << std::endl;
    }
};

int main() {
    // 分配和释放简单对象
    int* p = new int;
    *p = 10;
    std::cout << "Value of p: " << *p << std::endl;
    delete p;

    // 分配和释放简单对象数组
    int* arr = new int[5];
    for (int i = 0; i < 5; ++i) {
        arr[i] = i * 10;
        std::cout << "Value of arr[" << i << "]: " << arr[i] << std::endl;
    }
    delete[] arr;

    // 分配和释放复杂对象
    MyClass* obj = new MyClass;
    delete obj;

    // 分配和释放复杂对象数组
    MyClass* objArr = new MyClass[3];
    delete[] objArr;

    return 0;
}

        运行该示例后,将看到构造函数和析构函数的调用,表明对象的构建和释放过程。

注意事项

  1. 内存泄漏:确保每个 new 都有相应的 delete。特别是在异常处理和多路径逻辑中要小心。
  2. 数组的释放:使用 delete[] 释放数组内存,否则行为未定义。
  3. 智能指针:为了自动管理内存释放,C++11 引入了智能指针(例如 std::unique_ptr 和 std::shared_ptr),推荐使用智能指针来避免手动管理内存。

相关文章:

  • c++介绍进程间的通信一
  • K8s认证(CKA/CKAD/CKS)哪家强?主流证书对比
  • 《Linux 网络架构:基于 TCP 协议的多人聊天系统搭建详解》
  • Zookeeper 集群部署与管理实践
  • 第4章:Docker安装与环境配置:多平台部署指南
  • 流程图软件推荐,好用的流程图工具分享
  • 解决Qt信号在构造函数中失效的问题
  • DataWhale大语言模型-大模型技术基础
  • Git Worktree 实现 “一边修生产Bug,一边写新需求”
  • C++左值右值
  • vscode 配置服务器远程连接
  • VLLM专题(三十一)—架构概述
  • doris:审计日志
  • C#通过SignalR直接返回流式响应内容
  • 【RabbitMQ】RabbitMQ中死信交换机是什么?延迟队列呢?有哪些应用场景?
  • 【vue3+vant】移动端 - 部门树下拉选择组件 DeptTreeSelect 开发
  • Vue3 界面设计插件 microi-pageengine 入门教程一
  • MyBatis 学习经验分享
  • 责任链模式:优雅处理请求的设计艺术
  • Docker运行Mysql异常:Operation not permitted
  • 特朗普政府称将恢复被终止的外国学生合法身份
  • 一图读懂|上海海关公布一季度数据:钢材出口增长超143%
  • 钱学森数据服务中心在沪上线,十万个数字资源向公众开放
  • 安徽一交通事故责任认定引质疑:民警和司法鉴定人被处罚,已中止诉讼
  • 文昌市委原书记龙卫东已任海南省人社厅党组书记
  • 美官员称与乌克兰会谈富有成效,但仍存重大分歧