C++new相关学习
初步学习,内容不全,笔记自投。
Class: C++ClassByMyself
参考: 学习参考于TheCherno和Deepseek
C++new相关学习
掌握**new**操作符是理解动态内存管理的关键一步
为什么需要new?
- 运行时确定大小:程序运行时才知道需要多少内存
- 长生命周期:跨越函数作用域存活
- 大内存需求:栈空间有限(通常几MB),堆空间大得多
- 灵活控制:可以随时分配和释放
栈(stack) 堆(heap)
┌─────────┐ ┌─────────┐
│ pInt │ ────→ │ 10 │
├─────────┤ └─────────┘
│ pDouble │ ────→ │ 3.14 │
└─────────┘ └─────────┘
- 堆内存的数组值可以是变量!
int size = 5;
int* arr = new int[size]; // 分配5个int的数组
Cherno的说法:找到一个足够大的内存块来满足我们的需求,然后给我们一个指向那里的指针
- 实例时不加括号,就调用默认构造函数
- new不仅分配内存,它还会调用构造函数!!
- 指针类型存在的意义是——→控制指针
- 无论如何别忘了delete!
int* p = new int;
delete p; // 释放单个对象
int* arr = new int[10];
delete[] arr; // 释放数组
下面两种情况,一种应用于C++,另为C
它们的区别在于:
new会分配内存块的同时调用默认构造函数(相应类的)
C的版本仅有第一点
Entity* e = new Entity();
Entity* e = (Entity*)malloc(sizeof(Entity));
执行顺序:
new的执行步骤
当执行**new Type**时:
- 调用**
operator new分配内存(底层通常调用malloc**) - 在分配的内存上调用构造函数(对于类类型)
- 返回指向新创建对象的指针###
delete的执行步骤
- 调用对象的析构函数(对于类类型)
- 调用**
operator delete释放内存(底层通常调用free**)
内存管理与常见问题
1. 内存泄漏(Memory Leak)
void leak() {
int* p = new int[100];
// 忘记delete[] p;
} // p离开作用域,但分配的内存永远无法释放
检测工具:
ValgrindVisual Studio内存诊断工具AddressSanitizer
2. 悬挂指针(Dangling Pointer)
int* p = new int(42);
delete p;
*p = 10; // 危险!访问已释放内存
解决方案:
delete p;
p = nullptr; // 置为空指针
3. 重复释放(Double Free)
int* p = new int;
delete p;
delete p; // 错误!同一内存释放两次
进阶学习:
1.operator new函数
你可以重载这个函数来自定义内存分配方式:
void* operator new(size_t size) {
cout << "分配 " << size << " 字节" << endl;
return malloc(size);
}
2.不抛出异常的new
int* p = new(nothrow) int; // 分配失败返回nullptr而不是抛出异常
if(!p) {
cerr << "内存分配失败";
}
这个防配内存失败
学了半天发现智能指针才是最棒的!!!

550

被折叠的 条评论
为什么被折叠?



