最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++中new操作符的具體使用

 更新時(shí)間:2026年01月08日 10:23:47   作者:風(fēng)kkk  
本文主要介紹了c++中new操作符的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在 C++ 中,new 是一個(gè)關(guān)鍵字(操作符),主要用于在堆內(nèi)存(Heap) 上進(jìn)行動(dòng)態(tài)內(nèi)存分配。

與 C 語言中的 malloc 不同,new 不僅分配內(nèi)存,還會(huì)自動(dòng)調(diào)用對(duì)象的構(gòu)造函數(shù)來初始化對(duì)象。

以下是關(guān)于 new 的詳細(xì)介紹,包括基本用法、原理、高級(jí)用法以及現(xiàn)代 C++ 的最佳實(shí)踐。

1. 基本用法

1.1 分配單個(gè)對(duì)象

當(dāng)使用 new 分配單個(gè)對(duì)象時(shí),它返回指向該類型的指針。

// 1. 分配一個(gè) int,未初始化(值可能是隨機(jī)的)
int* p1 = new int; 

// 2. 分配一個(gè) int,并初始化為 10
int* p2 = new int(10); 

// 3. 分配一個(gè)類對(duì)象,自動(dòng)調(diào)用構(gòu)造函數(shù)
MyClass* obj = new MyClass(); 

// 使用完畢后,必須使用 delete 釋放
delete p1;
delete p2;
delete obj;
/*使用new從堆中分配一個(gè)int大小內(nèi)存,不同于malloc,new會(huì)返回一個(gè)具體類型的指針,而不是void* */
int* fun1()
{
    /*這里返回的雖然是一個(gè)局部變量指針,但因?yàn)槭菑亩阎蟹峙?,退出函?shù)后這塊內(nèi)存不會(huì)被銷毀*/
    return new int;
}

/*使用new操作符分配一個(gè)int類型內(nèi)存,并初始化為10 */
int* fun2()
{
    /*分配一個(gè)int類型內(nèi)存,賦值為10*/
    return new int(10);
}

/*使用new分配一個(gè)類對(duì)象內(nèi)存,在分配內(nèi)存時(shí)會(huì)調(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[] (帶方括號(hào))
delete[] arr; 

2.new與malloc的區(qū)別 (面試???

這是理解 C++ 內(nèi)存管理的關(guān)鍵點(diǎn):

特性new / deletemalloc / 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ì)算自動(dòng)計(jì)算類型大小需要手動(dòng)計(jì)算字節(jié)數(shù) (sizeof)
失敗處理拋出 std::bad_alloc 異常返回 NULL
重載允許重載不允許

3. 內(nèi)存分配失敗的處理

當(dāng)堆內(nèi)存耗盡時(shí),默認(rèn)情況下 new 會(huì)拋出異常,而不是返回空指針。

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)造對(duì)象。這通常用于內(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); 

// 注意:對(duì)于 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)存泄漏。
}

此外,配對(duì)錯(cuò)誤也是常見問題:

  • new 必須配對(duì) delete
  • new[] 必須配對(duì) delete[]

如果不匹配(例如對(duì)數(shù)組使用 delete),會(huì)導(dǎo)致未定義行為(通常是程序崩潰)。

6. 現(xiàn)代 C++ 最佳實(shí)踐 (C++11 及以后)

在現(xiàn)代 C++ 開發(fā)中,極其不推薦直接使用裸指針(Raw Pointer)和 new/delete。

應(yīng)該使用 RAII (資源獲取即初始化) 原則和 智能指針 來自動(dòng)管理內(nèi)存。

6.1std::unique_ptr(獨(dú)占所有權(quán))

這是最常用的智能指針。當(dāng)指針超出作用域時(shí),會(huì)自動(dòng)釋放內(nèi)存。

#include <memory>

// C++14 推薦寫法:使用 make_unique
auto ptr = std::make_unique<MyClass>(10); 

// 不需要調(diào)用 delete,由 ptr 的析構(gòu)函數(shù)自動(dòng)處理
ptr->doSomething();

6.2std::shared_ptr(共享所有權(quán))

當(dāng)多個(gè)指針需要指向同一個(gè)對(duì)象時(shí)使用。使用引用計(jì)數(shù),當(dāng)計(jì)數(shù)歸零時(shí)自動(dòng)釋放。

#include <memory>

auto ptr1 = std::make_shared<MyClass>(20);
auto ptr2 = ptr1; // 引用計(jì)數(shù) +1

// 當(dāng) ptr1 和 ptr2 都銷毀時(shí),內(nèi)存才會(huì)被釋放

總結(jié)

  1. new 用于在堆上分配內(nèi)存并初始化對(duì)象。
  2. 必須使用 delete 釋放內(nèi)存,否則會(huì)導(dǎo)致泄漏。
  3. 數(shù)組分配需用 new[]delete[]
  4. 最佳實(shí)踐:盡量避免直接使用 new,改用 std::make_uniquestd::make_shared 等智能指針,以確保內(nèi)存安全。

到此這篇關(guān)于c++中new操作符的具體使用的文章就介紹到這了,更多相關(guān)C++ new操作符 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入淺析C++ traits技術(shù)

    深入淺析C++ traits技術(shù)

    traits就是提取“被傳進(jìn)的對(duì)象”對(duì)應(yīng)的返回類型,讓同一個(gè)接口實(shí)現(xiàn)對(duì)應(yīng)的功能。因?yàn)镾TL的算法和容器是分離的,兩者通過迭代器鏈接,本文通過實(shí)例代碼給大家介紹C++ traits技術(shù),感興趣的朋友一起看看吧
    2021-05-05
  • C語言自定義實(shí)現(xiàn)strlen函數(shù)的3種方法總結(jié)

    C語言自定義實(shí)現(xiàn)strlen函數(shù)的3種方法總結(jié)

    這篇文章帶大家了解C語言中自定義實(shí)現(xiàn)strlen函數(shù)的3種方法,計(jì)數(shù)器,遞歸以及指針,這三種方法通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • C++實(shí)現(xiàn)LeetCode(100.判斷相同樹)

    C++實(shí)現(xiàn)LeetCode(100.判斷相同樹)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(100.判斷相同樹),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言中類型轉(zhuǎn)換不匹配的解決方案

    C語言中類型轉(zhuǎn)換不匹配的解決方案

    本文主要介紹了C語言中類型轉(zhuǎn)換不匹配的解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-12-12
  • C語言二分法求解方程根的兩種方法

    C語言二分法求解方程根的兩種方法

    這篇文章主要為大家詳細(xì)介紹了C語言二分法求解方程根的兩種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C++中將Char轉(zhuǎn)換成String的4種方法

    C++中將Char轉(zhuǎn)換成String的4種方法

    本文主要介紹了C++中將Char轉(zhuǎn)換成String的4種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • C++實(shí)現(xiàn)簡(jiǎn)單信息管理系統(tǒng)

    C++實(shí)現(xiàn)簡(jiǎn)單信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言算法積累分離數(shù)位示例

    C語言算法積累分離數(shù)位示例

    這篇文章主要為大家介紹了C語言算法積累分離數(shù)位的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 深入理解雙指針的兩種用法

    深入理解雙指針的兩種用法

    本篇文章是對(duì)雙指針的兩種用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 實(shí)例講解C++ 命名空間

    實(shí)例講解C++ 命名空間

    這篇文章主要介紹了C++ 命名空間的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06

最新評(píng)論

大悟县| 北宁市| 乐昌市| 九寨沟县| 交口县| 阆中市| 法库县| 邵阳市| 昂仁县| 镇江市| 汉寿县| 汝城县| 泾阳县| 改则县| 陇川县| 永登县| 临西县| 涞水县| 沿河| 长兴县| 盘山县| 秦安县| 镇赉县| 新巴尔虎右旗| 富顺县| 仪陇县| 苏尼特左旗| 黑山县| 永昌县| 云霄县| 和田市| 长泰县| 定结县| 江西省| 大兴区| 呼玛县| 江永县| 独山县| 大厂| 白山市| 区。|