nothrow——詳解

一、nothrowing

nothrowing是C++的一個關鍵字,用於指定調用new操作符時的異常處理方式。當使用nothrowing參數時,如果內存分配失敗,new操作符不會拋出異常,而是返回一個空指針。與之相對的是使用普通的new操作符,如果它無法為對象分配足夠的內存,那麼就會拋出一個std::bad_alloc類型的異常。

#include
using namespace std;
int main() {
    int *p;
    p = new (nothrow) int[100000000000];
    if (p==NULL) cout<<"內存分配失敗";
    else cout<<"內存分配成功";
    return 0;
}

在上述的代碼中,由於所需的內存過大,程序無法從操作系統中獲得足夠的內存,所以沒有內存被分配給指針p。如果沒有使用nothrow,這段程序將會拋出一個std::bad_alloc異常。

二、nothrow

在C++中,如果內存不足以分配對象,則new操作符會引發std::bad_alloc異常,然而,通過使用nothrow,我們可以避免產生這些異常。在C++中,當nothrow作為new的第二個參數傳遞時,它告訴new操作符,如果內存不足,則返回一個NULL指針而非拋出異常。例如:

#include
using namespace std;
int main() {
    int *p;
    p = new(nothrow) int[100000000000];
    if (p==NULL) cout<<"內存分配失敗";
    else cout<<"內存分配成功";
    return 0;
}

當內存不足時,該程序將輸出「內存分配失敗」。

三、怎麼讀

在C++程序中,可以按照以下方式發音:no-throw。發音時,聲調應落在’s’和’t’之間的元音上。

四、nothrow new

nothrow和nothrow new之間的區別是:若只使用nothrow,則會返回一個NULL指針;使用nothrow new,則不會返回NULL指針,而是返回一個指向失敗的new操作的指針。例如

#include
using namespace std;
int main() {
    int *p;
    p = new(nothrow) int[100000000000];
    if (p==NULL) cout<<"內存分配失敗";
    else cout<<"內存分配成功";
    delete[] p;
    return 0;
}

此程序將輸出「內存分配成功」,然而,在編寫代碼時,您應該避免在同一程序中同時使用nothrow和nothrow new。

五、nothrowing怎麼讀

nothrowing是C++的一個關鍵字,發音時,應該拼讀new和throwing之間的元音。在此單詞中,’g’不發音。

六、nothrow翻譯

上文中提到的「no-throw」表明其使用的目的,即使用此關鍵字時,將不會拋出一個std::bad_alloc類型的異常。

七、nothrow用法

使用一些其他的new版本時,如在STL中,使用nothrow能夠有效避免異常。例如,當使用vector時,如果它無法為元素分配足夠的內存,就會拋出異常。使用nothrow分配內存可避免中斷程序的執行。例如:

#include
#include
using namespace std;
int main() {
    vector v;
    try {
        for (int i=0; i<1000000000; i++)
            v.push_back(i);
    }
    catch(...) {
        cout<<"內存分配失敗";
    }
    return 0;
}

當數據量過大時,該程序將輸出「內存分配失敗」。但是,如果我們使用nothrow,則可以避免該程序拋出異常。例如:

#include
#include
using namespace std;
int main() {
    vector v;
    for (int i=0; i<1000000000; i++) {
        int *p = new (nothrow) int(1);
        if (p==NULL) {
            cout<<"內存分配失敗";
            break;
        }
        v.push_back(*p);
    }
    return 0;
}

該程序將輸出「內存分配失敗」,但是可以在push_back函數之前使用new(nothrow)為元素分配內存。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/180040.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-22 05:10
下一篇 2024-11-22 05:10

相關推薦

  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分佈式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • C語言貪吃蛇詳解

    一、數據結構和算法 C語言貪吃蛇主要運用了以下數據結構和算法: 1. 鏈表 typedef struct body { int x; int y; struct body *nex…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變量讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25

發表回復

登錄後才能評論