c++中new操作符的具體使用
在 C++ 中,new 是一個(gè)關(guān)鍵字(操作符),主要用于在堆內(nèi)存(Heap) 上進(jìn)行動態(tài)內(nèi)存分配。
與 C 語言中的 malloc 不同,new 不僅分配內(nèi)存,還會自動調(diào)用對象的構(gòu)造函數(shù)來初始化對象。
以下是關(guān)于 new 的詳細(xì)介紹,包括基本用法、原理、高級用法以及現(xiàn)代 C++ 的最佳實(shí)踐。
1. 基本用法
1.1 分配單個(gè)對象
當(dāng)使用 new 分配單個(gè)對象時(shí),它返回指向該類型的指針。
// 1. 分配一個(gè) int,未初始化(值可能是隨機(jī)的) int* p1 = new int; // 2. 分配一個(gè) int,并初始化為 10 int* p2 = new int(10); // 3. 分配一個(gè)類對象,自動調(diào)用構(gòu)造函數(shù) MyClass* obj = new MyClass(); // 使用完畢后,必須使用 delete 釋放 delete p1; delete p2; delete obj;
/*使用new從堆中分配一個(gè)int大小內(nèi)存,不同于malloc,new會返回一個(gè)具體類型的指針,而不是void* */
int* fun1()
{
/*這里返回的雖然是一個(gè)局部變量指針,但因?yàn)槭菑亩阎蟹峙?,退出函?shù)后這塊內(nèi)存不會被銷毀*/
return new int;
}
/*使用new操作符分配一個(gè)int類型內(nèi)存,并初始化為10 */
int* fun2()
{
/*分配一個(gè)int類型內(nèi)存,賦值為10*/
return new int(10);
}
/*使用new分配一個(gè)類對象內(nèi)存,在分配內(nèi)存時(shí)會調(diào)用這個(gè)類的構(gòu)造函數(shù)初始化這塊內(nèi)存*/
// my_class* fun3()
// {
// return new my_clash();
// }
/*使用new分配一個(gè)數(shù)組*/
int* fun4()
{
return new int[10];
}
int main()
{
int *p1 = fun1();
*p1 = 20;
cout << "p1指向的值為:" << *p1 << endl;
delete p1;
int *p2 = fun2();
cout << "p2指向的值為:" << *p2 << endl;
delete p2;
// my_clash *p3 = fun3();
// delete p3;
int *p4 = fun4();
cout << "p4指向的數(shù)組為:";
for (int i = 0; i < 10;i++)
{
p4[i] = i;
cout << p4[i] << " ";
}
cout << endl;
system("pause");
return 0;
}

1.2 分配數(shù)組
使用 new 也可以分配連續(xù)的內(nèi)存空間(數(shù)組)。
// 分配一個(gè)包含 10 個(gè)整數(shù)的數(shù)組 int* arr = new int[10]; // 訪問數(shù)組元素 arr[0] = 5; // 注意:釋放數(shù)組時(shí)必須使用 delete[] (帶方括號) delete[] arr;
2.new與malloc的區(qū)別 (面試???
這是理解 C++ 內(nèi)存管理的關(guān)鍵點(diǎn):
| 特性 | new / delete | malloc / free |
|---|---|---|
| 屬性 | C++ 關(guān)鍵字 (操作符) | C 語言標(biāo)準(zhǔn)庫函數(shù) |
| 初始化 | 分配內(nèi)存 + 調(diào)用構(gòu)造函數(shù) | 僅分配內(nèi)存,不初始化 |
| 返回值 | 返回具體類型的指針 (無需強(qiáng)轉(zhuǎn)) | 返回 void* (需要強(qiáng)轉(zhuǎn)) |
| 大小計(jì)算 | 自動計(jì)算類型大小 | 需要手動計(jì)算字節(jié)數(shù) (sizeof) |
| 失敗處理 | 拋出 std::bad_alloc 異常 | 返回 NULL |
| 重載 | 允許重載 | 不允許 |
3. 內(nèi)存分配失敗的處理
當(dāng)堆內(nèi)存耗盡時(shí),默認(rèn)情況下 new 會拋出異常,而不是返回空指針。
3.1 標(biāo)準(zhǔn)行為(拋出異常)
try {
int* bigArray = new int[1000000000000]; // 試圖分配巨大的內(nèi)存
} catch (const std::bad_alloc& e) {
std::cout << "內(nèi)存分配失敗: " << e.what() << std::endl;
}
3.2 不拋出異常(std::nothrow)
如果你希望像 C 語言那樣在失敗時(shí)返回 nullptr,可以使用 std::nothrow 版本:
#include <new> // 必須包含
int* p = new(std::nothrow) int[1000000000000];
if (p == nullptr) {
std::cout << "內(nèi)存分配失敗,指針為空" << std::endl;
} else {
delete[] p;
}
4. 進(jìn)階:Placement New (定位 new)
placement new 允許你在已經(jīng)分配好的內(nèi)存上構(gòu)造對象。這通常用于內(nèi)存池、嵌入式系統(tǒng)或高性能庫中,以避免頻繁的內(nèi)存分配/釋放開銷。
#include <new> char buffer[sizeof(MyClass)]; // 預(yù)先分配的棧內(nèi)存或堆內(nèi)存 // 在 buffer 的地址上調(diào)用 MyClass 的構(gòu)造函數(shù) MyClass* p = new (buffer) MyClass(123); // 注意:對于 Placement New,不能使用 delete p // 必須顯式調(diào)用析構(gòu)函數(shù) p->~MyClass(); // 如果 buffer 是堆內(nèi)存,最后釋放 buffer // delete[] buffer;
5. 常見陷阱:內(nèi)存泄漏 (Memory Leak)
使用 new 最大的風(fēng)險(xiǎn)就是忘記 delete。
void badFunction() {
int* ptr = new int(5);
// ... 做一些操作
// 函數(shù)結(jié)束,ptr 變量銷毀了,但它指向的堆內(nèi)存沒有釋放!
// 這就是內(nèi)存泄漏。
}
此外,配對錯(cuò)誤也是常見問題:
new必須配對deletenew[]必須配對delete[]
如果不匹配(例如對數(shù)組使用 delete),會導(dǎo)致未定義行為(通常是程序崩潰)。
6. 現(xiàn)代 C++ 最佳實(shí)踐 (C++11 及以后)
在現(xiàn)代 C++ 開發(fā)中,極其不推薦直接使用裸指針(Raw Pointer)和 new/delete。
應(yīng)該使用 RAII (資源獲取即初始化) 原則和 智能指針 來自動管理內(nèi)存。
6.1std::unique_ptr(獨(dú)占所有權(quán))
這是最常用的智能指針。當(dāng)指針超出作用域時(shí),會自動釋放內(nèi)存。
#include <memory> // C++14 推薦寫法:使用 make_unique auto ptr = std::make_unique<MyClass>(10); // 不需要調(diào)用 delete,由 ptr 的析構(gòu)函數(shù)自動處理 ptr->doSomething();
6.2std::shared_ptr(共享所有權(quán))
當(dāng)多個(gè)指針需要指向同一個(gè)對象時(shí)使用。使用引用計(jì)數(shù),當(dāng)計(jì)數(shù)歸零時(shí)自動釋放。
#include <memory> auto ptr1 = std::make_shared<MyClass>(20); auto ptr2 = ptr1; // 引用計(jì)數(shù) +1 // 當(dāng) ptr1 和 ptr2 都銷毀時(shí),內(nèi)存才會被釋放
總結(jié)
new用于在堆上分配內(nèi)存并初始化對象。- 必須使用
delete釋放內(nèi)存,否則會導(dǎo)致泄漏。 - 數(shù)組分配需用
new[]和delete[]。 - 最佳實(shí)踐:盡量避免直接使用
new,改用std::make_unique或std::make_shared等智能指針,以確保內(nèi)存安全。
到此這篇關(guān)于c++中new操作符的具體使用的文章就介紹到這了,更多相關(guān)C++ new操作符 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實(shí)現(xiàn)學(xué)生成績等級劃分的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于C語言實(shí)現(xiàn)學(xué)生成績等級劃分的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
C++特殊類設(shè)計(jì)與類型轉(zhuǎn)換詳細(xì)代碼示例
在C++編程語言中,類類型轉(zhuǎn)換操作符是一種特殊的功能,允許我們把一個(gè)類的對象轉(zhuǎn)換為其他類型,如內(nèi)置類型、類類型或者由類型別名定義的類型,這篇文章主要介紹了C++特殊類設(shè)計(jì)與類型轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下2026-01-01
Windows下ncnn環(huán)境配置教程詳解(VS2019)
這篇文章主要介紹了Windows下ncnn環(huán)境配置(VS2019),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
C語言 function recursion函數(shù)遞歸詳解
遞歸指的是在函數(shù)的定義中使用函數(shù)自身的方法,舉個(gè)例子: 從前有座山,山里有座廟,廟里有個(gè)老和尚,正在給小和尚講故事呢!故事是什么呢?"從前有座山,山里有座廟,廟里有個(gè)老和尚,正在給小和尚講故事呢!故事是什么呢?"從前有座山,山里有座廟,循環(huán)下去2021-10-10

