使用std :: unique_ptr创建对象时的奇怪行为。这是两个示例:
#include<iostream>
#include<memory>
using namespace std;
class A
{
public:
A() {
throw "EOF";
}
void show()
{
cout<<"A::show()"<<endl;
}
};
int main()
{
try {
unique_ptr<A> p1 = make_unique<A>();
p1 -> show();
} catch(...) {
cout << "Exception" << endl;
}
return 0;
}
输出
Exception
上面的输出看起来很明显。但是,以下代码的输出是奇数。
// C++ program to illustrate the use of unique_ptr
#include<iostream>
#include<memory>
using namespace std;
class A
{
public:
A() {
throw "EOF";
}
void show()
{
cout<<"A::show()"<<endl;
}
};
int main()
{
try {
unique_ptr<A> p1;
p1 -> show();
} catch(...) {
cout << "Exception" << endl;
}
return 0;
}
输出
A::show()
这些示例是使用c ++ 14编译器编译的。 以上输出是预期行为吗?
答案 0 :(得分:2)
您的第二个示例实际上并未创建A
对象。它仅创建unique_ptr
到未初始化的A
。取消引用此类指针是“未定义行为”,并且允许编译器执行所需的任何操作,但您不能依赖任何特定的行为。示例二是破损的代码。
答案 1 :(得分:1)
以上输出是预期行为吗?
是的,不是。没有正确的行为,因为间接定义一个空的智能指针的行为是不确定的,就像间接定义一个空指针的行为一样。因此,您不应该特别期待任何东西,但是也没有什么是意料之外的。