当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创建的对象(因为它在堆栈上),它的析构函数会自动调用吗?
首先,我修复了你的代码,因为它是一个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_ptr
,auto_ptr
也可以在这里使用。
您想使用智能指针:
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,和类是在。 确保它们都是相同的版本。
这是主要的方法: 运行时,这是堆栈跟踪:
我有一个类(我不能修改),它只有一个构造函数,它接受一个参数,如下所示: 由于构造函数可以抛出错误,我想实现错误处理。我的第一次尝试是: 但是,现在在块的范围内,不能在其他地方使用。如果我理解正确,我不能在没有初始化的情况下声明对象,因此我可以在块之外声明。那么,我该如何捕捉构造函数抛出的错误呢? 编辑:为了澄清,这是在我的中,在中我将中止程序。此外,参数是一个将被打开的文件,因此没有已知的安全输
这是我的代码: 以下是我的任务要求: 一个参数化构造函数,将接收endpoint(作为点)、方向(作为int)和样式(作为字符串)。如果接收到的点或字符串为空,则抛出新的IllegalArgumentException( 我知道我检查样式是虚线、虚线还是双精度的部分出了问题,因为当我把它注释出来时,除了那个部分,所有的东西都工作了。就现在的情况而言,它只是在所有事情上抛出了非法的辩论例外。 我有一