c++比较与对比动态内存分配和回收运算符new,new[],delete,delete[]。

在C++中,动态内存管理是通过运算符 newnew[]deletedelete[] 来实现的。它们分别用于分配和释放动态内存。

1. newnew[]

new

1.用途:用于分配单个对象的内存。

2.语法

cpp 复制代码
Type* ptr = new Type;

行为:

1.分配足够的内存来存储一个 Type 类型的对象。

2.调用 Type 的构造函数来初始化对象。

3.返回指向分配内存的指针。

示例

cpp 复制代码
int* ptr = new int;  // 分配一个 int 类型的内存
*ptr = 10;           // 初始化
new[]

1.用途:用于分配数组的内存。

2.语法

cpp 复制代码
Type* ptr = new Type[size];

行为:

1.分配足够的内存来存储 size 个 Type 类型的对象。

2.对数组中的每个元素调用 Type 的构造函数。

3.返回指向数组第一个元素的指针。

示例

cpp 复制代码
int* arr = new int[5];  // 分配一个包含 5 个 int 的数组
for (int i = 0; i < 5; ++i) {
    arr[i] = i + 1;      // 初始化数组
}

2. deletedelete[]

delete

1.用途 :用于释放通过 new 分配的单个对象的内存。

2.语法

cpp 复制代码
delete ptr;

行为:

1.调用 ptr 指向对象的析构函数。

2.释放对象占用的内存。

示例

cpp 复制代码
int* ptr = new int;
*ptr = 10;
delete ptr;  // 释放内存
delete[]

1.用途 :用于释放通过 new[] 分配的数组的内存。

2.语法

cpp 复制代码
delete[] ptr;

行为:

1.对数组中的每个元素调用析构函数。

2.释放整个数组占用的内存。

示例

cpp 复制代码
int* arr = new int[5];
delete[] arr;  // 释放数组内存

3. 比较与对比

特性 new new[] delete delete[]
用途 分配单个对象的内存 分配数组的内存 释放单个对象的内存 释放数组的内存
语法 Type* ptr = new Type; Type* ptr = new Type[size]; delete ptr; delete[] ptr;
构造函数调用 调用单个对象的构造函数 调用数组中每个元素的构造函数 调用单个对象的析构函数 调用数组中每个元素的析构函数
析构函数调用 不直接涉及 不直接涉及 调用单个对象的析构函数 调用数组中每个元素的析构函数
内存释放范围 单个对象 整个数组 单个对象 整个数组
错误使用后果 使用 delete[] 会导致未定义行为 使用 delete 会导致未定义行为 使用 delete[] 会导致未定义行为 使用 delete 会导致未定义行为

4. 注意事项

  1. 配对使用

    • new 必须与 delete 配对使用。

    • new[] 必须与 delete[] 配对使用。

    • 如果混用(例如用 delete 释放 new[] 分配的内存),会导致未定义行为(如内存泄漏或程序崩溃)。

  2. 内存泄漏

    • 如果忘记调用 deletedelete[],会导致内存泄漏。
  3. 初始化

    • newnew[] 会调用构造函数,因此分配的内存会被初始化。

    • 如果需要避免初始化,可以使用 std::mallocstd::calloc(但不推荐,因为它们不会调用构造函数)。

  4. 异常安全

    • 如果 newnew[] 分配内存失败,会抛出 std::bad_alloc 异常(除非使用 nothrow 版本)。
  5. 智能指针

    • 在现代 C++ 中,推荐使用智能指针(如 std::unique_ptrstd::shared_ptr)来管理动态内存,避免手动调用 deletedelete[]

5. 示例代码

cpp 复制代码
#include <iostream>

class MyClass {
public:
    MyClass() { std::cout << "Constructor called!\n"; }
    ~MyClass() { std::cout << "Destructor called!\n"; }
};

int main() {
    // 使用 new 和 delete
    MyClass* obj = new MyClass;  // 调用构造函数
    delete obj;                  // 调用析构函数

    // 使用 new[] 和 delete[]
    MyClass* arr = new MyClass[3];  // 调用 3 次构造函数
    delete[] arr;                   // 调用 3 次析构函数

    return 0;
}

6. 总结

1.newnew[] 用于动态分配内存,分别用于单个对象和数组。

2.deletedelete[] 用于释放内存,必须与 newnew[] 配对使用。

3.混用 new/deletenew[]/delete[] 会导致未定义行为。

4.在现代 C++ 中,推荐使用智能指针来避免手动管理内存。

相关推荐
2601_962203514 分钟前
Java进阶07集合(续)
java·开发语言
郑州光合科技余经理25 分钟前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
小灰灰搞电子26 分钟前
C++ 引用折叠详解
c++
来了就未晚1 小时前
Python基础 学习代码存储与命名规范
开发语言·python·学习
布莱克6051 小时前
数组详解:定义、作用、应用场景及与链表的区别(C/C++ 代码讲解)
c语言·开发语言·c++·数组
hongmai6668881 小时前
MP2348GTL-Z:这颗24V/4A同步降压芯片,把性能和体积平衡得恰到好处
c语言·开发语言·arm开发·单片机·5g
多弗朗皮卡丘1 小时前
C语言梦开始的地方19:文件操作
c语言·开发语言
Dovis(誓平步青云)1 小时前
折叠屏悬停看视频,上半屏和下半屏应该各做什么
android·java·服务器·开发语言·安全·音视频
benchmark_cc2 小时前
Python量化实战:如何检测并剔除历史数据中的“闪崩/乌龙指”异常价格点?
开发语言·人工智能·python·量化·quantdash·量化数据源
2501_937860942 小时前
Java多线程初阶(下)—— synchronized、volatile、wait/notify与经典并发工具
java·开发语言·jvm