C++关键字之new

1.介绍

        在C++中,new是一个用于动态内存分配的关键字。它允许程序在运行时从堆(heap)中分配内存,并返回指向该内存的指针。new是 C++ 中管理动态内存的主要方式之一,与 C 语言中的malloc类似,但new更安全和强大,因为它会自动调用构造函数并支持异常处理。

2.new基本用法

        (1)分配基本类型

pointer = new type;

        type 是要分配内存的数据类型(例如int double等)。

        pointer是指向分配内存的指针。例如

int* ptr = new int; // 分配一个 int 类型的内存
*ptr = 10;         // 给分配的内存赋值
std::cout << *ptr; // 输出 10
delete ptr;        // 释放内存

        (2)分配数组

        new也可以用于分配数组内存,

pointer = new type[size];

        size是数组的大小。

        分配的内存必须用delete[]释放。例如

int* arr = new int[5]; // 分配一个包含 5 个整数的数组
for (int i = 0; i < 5; i++) {
    arr[i] = i + 1; // 初始化数组
}
delete[] arr; // 释放数组内存

        (3)初始化动态分配的内存

        new支持在分配内存时进行初始化。例如

int* ptr = new int(42); // 分配内存并初始化为 42
std::cout << *ptr;      // 输出 42
delete ptr;

//(C++11以上)
int* arr = new int[5]{1, 2, 3, 4, 5}; // 分配并初始化数组
delete[] arr;

        (4)分配对象

        new会自动调用对象的构造函数。例如

class MyClass {
public:
    MyClass() {
        std::cout << "构造函数调用\n";
    }
    ~MyClass() {
        std::cout << "析构函数调用\n";
    }
};

MyClass* obj = new MyClass; // 调用构造函数
delete obj;                 // 调用析构函数

        (5)异常处理

        如果内存分配失败,new会抛出bad::bad_alloc异常。可以使用try-catch块捕获异常。例如

try {
    int* ptr = new int[1000000000000]; // 尝试分配大量内存
} catch (const std::bad_alloc& e) {
    std::cerr << "内存分配失败: " << e.what() << "\n";
}

        (6)new和delete的配对

        每次使用new分配内存后,必须使用delete释放内存,否者会导致内存泄漏。

        对于单个对象,使用delete。

        对于数组,使用delete[]。例如

int* ptr = new int; // 分配单个 int
delete ptr;         // 释放单个 int

int* arr = new int[10]; // 分配数组
delete[] arr;           // 释放数组
3.new与malloc的区别
特性newmalloc
语言C++C
调用构造函数

调用析构函数
返回类型类型安全的指针(如int*)void*(需要强制类型转换)
异常处理抛出bad_alloc异常

返回NULL

内存大小计算自动计算手动计算
4.定位new

        定位new允许在已经分配的内存上构造对象。它不分配内存,而是在指定的内存地址调用构造函数。例如

#include <new> // 必须包含 <new> 头文件

char buffer[sizeof(MyClass)]; // 预分配内存
MyClass* obj = new (buffer) MyClass; // 在 buffer 上构造对象
obj->~MyClass(); // 显式调用析构函数
5.new的替代方案

        虽然new提供了灵活的动态内存管理,但在现代C++中,推荐使用智能指针或标准库容器来避免手动管理内存。例如

#include <memory> // 智能指针头文件

std::unique_ptr<int> ptr = std::make_unique<int>(10); // 自动管理内存
std::cout << *ptr; // 输出 10
// 不需要手动调用 delete
6.总结
  • new用于动态分配内存,并返回指向该内存的指针。

  • new会自动调用构造函数,delete会自动调用析构函数。

  • 分配数组时使用 new[],释放时使用delete[]。

  • 推荐使用智能指针或标准库容器替代手动管理内存。

  • 定位new允许在指定内存地址构造对象。

如有错误,敬请指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值