gpt4 book ai didi

C++ bad_alloc 异常

转载 作者:可可西里 更新时间:2023-11-01 13:50:51 25 4
gpt4 key购买 nike

我正在 try catch 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 调用析构函数对象。

关于C++ bad_alloc 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8919024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com