当前位置: 首页 > 知识库问答 >
问题:

C bad_alloc抛出一个构造函数

申屠浩歌
2023-03-14

bad_alloc异常在构造函数中被抛出时,其中创建了多个对象,必须做些什么来清理内存。例如。

class Object
{
   private:
     A * a;
     B  * b;

 public:

   Object()
   {
       a= new A();
       b= new B(); //So if a bad_alloc is called here, how is a deleted???
   }
} 

我的直觉是,将每个对new的调用放在一个单独的try-catch组中,并删除之前为其调用了new,但这太冗长的所有对象(第一个try组不调用析构函数,第二个类调用第一个类的析构函数,第三个类调用前两个类的析构函数,以此类推)。我的问题是:最常见的处理方法是什么?

另外,假设类对象包含一个不是用new创建的对象(因为它在堆栈上),它的析构函数会自动调用吗?

共有2个答案

宋瀚海
2023-03-14

首先,我修复了你的代码,因为它是一个C问题,所以它必须写成C。构造函数可能会失败,除了bad_alloc之外还有其他异常

你的选择有:

>

存储某种智能指针,如unique_ptr,它实际上是一个对象,因此像对象一样被清理,如果有,则删除底层指针。

在类中存储一个常规指针,但在构造函数期间使用unique_ptr(如果unique_ptr不可用,则使用auto_ptr),最后当您知道所有内容都已正确构造时,可以将智能指针释放到成员变量中。

后一种解决方案如下所示:

 // header file
 //
class A; // implementation hidden on purpose
class B; // ditto

class Object
{
   private:
      A * a;
      B * b;

   public:
     Object();
     ~Object();

    private:

 // if not using C++11 do not put in =delete but still declare these

    Object( const Object & ) = delete;
    Object& operator=( const Object & ) = delete;

};

// cpp file

#include "object.h"
#include "a.h"
#include "b.h"

Object::Object()
   : a( nullptr ), // use NULL or 0 if nullptr not available
     b( nullptr )
{
    std::unique_ptr< A > pa( new A ); // might throw
    std::unique_ptr< B > pb( new B ); // might throw (1)

    a = pa.release(); // cannot throw
    b = pb.release(); 
}

Object::~Object()
{
     delete b;
     delete a;
}

(1)如果它抛出本地的pa将调用其析构函数,这将删除您使用new创建的指针。

注意:如果您没有可用的unique_ptrauto_ptr也可以在这里使用。

景品
2023-03-14

您想使用智能指针:

class Object {
    std::unique_ptr<A> a;
    std::unique_ptr<B> b;

public:
    Object() : a(make_unique<A>()), b(make_unique<B>()) {}
}
 类似资料:
  • Spring文档说: 每个类只能标记一个带注释的构造函数,但是可以注释多个非必需的构造函数。在这种情况下,每个都被认为是候选的,Spring使用最贪婪的构造函数,其依赖关系可以得到满足——也就是说,具有最多参数的构造函数。构造函数解析算法与具有重载构造函数的非注释类相同,只是将候选对象缩小为注释构造函数。 我测试了它,当我有另一个由 错误: 组织。springframework。豆。工厂BeanC

  • 我的问题是关于OOP(C)中的构造函数。当我在一个类中将默认构造函数定义为private,并且在main中将该类的一个对象初始化为default时,就会出现默认构造函数不可访问的错误。这很好。但我也在Public部分中使用默认参数构造函数,当我再次在main中初始化对象时,就会出现对函数重载的不明确调用。所以我的问题是,如果不能从main访问私有构造函数,那么编译器应该调用公共部分中的构造函数,这

  • 问题内容: 我正在使用Jackson示例代码对POJO进行反序列化: 这行抛出一个NoSuchMethodError: 我不明白 问题答案: 我猜您的Jackson JAR不同步。本类是JAR,和类是在。 确保它们都是相同的版本。

  • 这是主要的方法: 运行时,这是堆栈跟踪:

  • 有了Deck对象之后,我们有必要初始化其中的Card对象。上一章的buildDeck函数稍作修改就可使用,但是更自然的方法是为Deck类再添加一个构造函数,代码如下: Deck::Deck () { apvector<Card> temp (52); cards = temp; int i = 0; for (Suit suit = CLUBS; suit <= SPADES; s

  • 我有一个类(我不能修改),它只有一个构造函数,它接受一个参数,如下所示: 由于构造函数可以抛出错误,我想实现错误处理。我的第一次尝试是: 但是,现在在块的范围内,不能在其他地方使用。如果我理解正确,我不能在没有初始化的情况下声明对象,因此我可以在块之外声明。那么,我该如何捕捉构造函数抛出的错误呢? 编辑:为了澄清,这是在我的中,在中我将中止程序。此外,参数是一个将被打开的文件,因此没有已知的安全输