【C/C++】new关键字解析

📘 C++ 中 new 关键字详解笔记

🔹 什么是 new

new 是 C++ 中用于动态内存分配 的关键字,它在堆内存中为对象或变量分配空间,并返回对应类型的指针。

与 C 语言中的 malloc 相比,new 更安全、更方便,并支持调用构造函数。


✅ 基本语法

cpp 复制代码
int* p = new int;         // 分配一个 int,未初始化
int* q = new int(42);     // 分配一个 int,并初始化为 42
double* arr = new double[5]; // 分配一个 double 类型的数组,长度为 5

📌 说明:初始化为 42 ≠ 分配 42 字节

cpp 复制代码
int* q = new int(42);

这句代码的含义是:

  • 在堆上分配一个 int 类型大小的内存(通常为 4 字节)
  • 并将该 int 类型的值初始化为 42
  • 返回这块内存的地址,并由指针 q 接收

它并不是"分配了 42 字节的空间",只是"将分配的 int 类型变量初始化为值 42"。


🧱 使用示例

🌟 分配单个变量

cpp 复制代码
int* a = new int;     // 分配内存但未初始化
*a = 10;              // 使用分配的空间

🌟 分配并初始化

cpp 复制代码
int* b = new int(100);   // 分配并初始化为 100

🌟 分配数组

cpp 复制代码
int* arr = new int[5];
for (int i = 0; i < 5; i++) {
    arr[i] = i * i;
}

🌟 类对象的动态创建

cpp 复制代码
class Person {
public:
    Person() { std::cout << "Person 构造函数\n"; }
    ~Person() { std::cout << "Person 析构函数\n"; }
};

Person* p = new Person(); // 调用构造函数
// 使用对象...
delete p;                 // 调用析构函数,释放内存

🧼 配套释放:deletedelete[]

cpp 复制代码
delete a;       // 释放单个变量
delete b;
delete[] arr;   // 释放数组,必须用 delete[]

❗ 错误用法:数组用 delete 会导致内存泄漏或未定义行为。


🧠 new vs malloc 对比

特性 new malloc
所属语言 C++ C / C++
类型安全 ✅ 是 ❌ 否(需强转)
返回类型 指定类型指针 void*
是否初始化 ✅ 可以初始化 ❌ 不初始化
调用构造函数 ✅ 是 ❌ 否
配套释放方法 delete / delete[] free()

示例对比:

cpp 复制代码
// C++ 写法
int* a = new int(10);  // 初始化并安全分配

// C 写法
int* b = (int*)malloc(sizeof(int));
*b = 10;

🔍 小结

  • new 关键字用于堆上分配内存,是 C++ 的推荐做法。
  • new 自动计算类型大小、调用构造函数,并返回强类型指针。
  • 使用 new 后必须搭配 delete,否则会产生内存泄漏。
  • 对于数组使用 new[],释放时对应使用 delete[]
  • malloc 相比,new 更安全、更现代、更适合 C++ 风格。

💡 如果你使用的是现代 C++(C++11 及以上),推荐使用智能指针如 std::unique_ptrstd::shared_ptr 替代 new


📎 拓展阅读

  • 智能指针与 new 的关系
  • placement new 的特殊用法
  • 构造函数与析构函数执行顺序

相关推荐
tan180°5 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
学不动CV了5 小时前
ARM单片机启动流程(二)(详细解析)
c语言·arm开发·stm32·单片机·51单片机
彭祥.6 小时前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
lzb_kkk6 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
猫猫的小茶馆7 小时前
【STM32】通用定时器基本原理
c语言·stm32·单片机·嵌入式硬件·mcu·51单片机
胖大和尚8 小时前
clang 编译器怎么查看在编译过程中做了哪些优化
c++·clang
pumpkin845148 小时前
Rust 调用 C 函数的 FFI
c语言·算法·rust
2401_858286119 小时前
125.【C语言】数据结构之归并排序递归解法
c语言·开发语言·数据结构·算法·排序算法·归并排序
钱彬 (Qian Bin)9 小时前
一文掌握Qt Quick数字图像处理项目开发(基于Qt 6.9 C++和QML,代码开源)
c++·开源·qml·qt quick·qt6.9·数字图像处理项目·美观界面
双叶83610 小时前
(C++)学生管理系统(正式版)(map数组的应用)(string应用)(引用)(文件储存的应用)(C++教学)(C++项目)
c语言·开发语言·数据结构·c++