C ++中的unique_ptr行为

时间:2018-10-08 18:02:30

标签: c++ c++14 unique-ptr

使用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编译器编译的。 以上输出是预期行为吗?

2 个答案:

答案 0 :(得分:2)

您的第二个示例实际上并未创建A对象。它仅创建unique_ptr到未初始化的A。取消引用此类指针是“未定义行为”,并且允许编译器执行所需的任何操作,但您不能依赖任何特定的行为。示例二是破损的代码。

答案 1 :(得分:1)

  

以上输出是预期行为吗?

是的,不是。没有正确的行为,因为间接定义一个空的智能指针的行为是不确定的,就像间接定义一个空指针的行为一样。因此,您不应该特别期待任何东西,但是也没有什么是意料之外的。