簡體   English   中英

C ++ bad_alloc異常

[英]C++ bad_alloc exception

我試圖捕獲bad_alloc異常,以證明使用了析構函數。

這是我的對象:

#include "Obj.h"
#include<iostream>
using namespace std;

Obj::Obj() {
d = new double[200000000];
}
Obj::~Obj() {
cout << "destroyed \n";
}

主要方法:

#include "Obj.h"
#include <iostream>
using namespace std;
int main(){
Obj* ptr[1000000];
try{
    for(int i=0; i<1000; i++){
        ptr[i] = new Obj();
    }
} catch(bad_alloc){
    cout<<"EXCEPTION";
}
}

我的程序不再捕獲異常,而是停止並嘗試在線查找解決方案(Windows)。 為什么會這樣?

編輯我現在得到異常,但我應該證明在拋出異常之前使用了析構函數。 我該怎么辦?

在您開始動態分配對象之前,會出現此問題。 如果運行附帶調試器的程序,您將看到程序因堆棧溢出而終止。 為什么?

Obj* ptr[1000000];

您無法聲明具有自動存儲持續時間的對象如此之大。 當輸入main ,它會嘗試在堆棧上為此對象分配空間,但無法執行此操作,從而導致拋出堆棧溢出結構化異常。 您的應用程序不處理此異常,因此運行時終止程序。

但請注意,程序永遠不會調用Obj析構函數。 使用new動態分配對象時,您負責使用delete銷毀它。 由於您沒有調用delete來銷毀您創建的對象,因此它們永遠不會被銷毀。

如果您使用std::vector<std::unique_ptr<Obj>>代替(或者,就此而言,只是std::vector<Obj> ),您會看到析構函數將被調用對於每個完全創建的Obj對象。

請記住,您正在嘗試使用您的ptr數組在堆棧上存儲一個非常大的數組...很可能您的問題是,在operator new能夠運行之前,您已經溢出了為應用程序分配的堆棧的默認大小因內存不足而失敗。

我將所有代碼粘貼到一個文件中,稍微增加了整數常量,完成了Obj的類定義,並通過一些調試重新編寫代碼。 在64位unix服務器上,它在嘗試執行Obj構造函數時正確地打印出“異常”。

#include<iostream>
using namespace std;

struct Obj {
Obj() {
d = new double[20000000000000000LL];
}
~Obj() {
cout << "destroyed \n";
}

double* d;
};

int main(){
Obj* ptr[1000000];
try{
    for(int i=0; i<1000; i++){
        ptr[i] = new Obj();
        cout<<"bah!"<<endl;
    }
} catch(bad_alloc){
    cout<<"EXCEPTION";
}
cout<<"Done."<<endl;
}

[jhumphreys@suoserv ~]$ g++ so2.cpp
[jhumphreys@suoserv ~]$ ./a.out
EXCEPTIONDone.
[jhumphreys@suoserv ~]$

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM