2014-05-05 39 views
2

我想弄清楚这段代码打印的内容,但由于某种原因我无法输出它,它给了我一个错误:“1 [main] Q1c 5752 open_stackdumpfile:转储堆栈跟踪到Q1c.exe.stackdump“。C++中的自动指针(auto_ptr)

double *dp=new double(1.2); 
auto_ptr <double> autodp1(dp); 
auto_ptr <double> autodp2=autodp1; 
cout<<*autodp1<<endl; 

我只是想知道它会打印什么,如果它甚至打印。

注意:这个问题在以前的考卷中,只是为了修改。

+2

'auto_ptr'非常难以使用,更不用说正确使用了。除非你是C++专家,否则不要使用它。 –

+3

未定义的行为。它甚至可以打印'“失败!”'。 – juanchopanza

+0

@KerrekSB我没有使用它,这只是一个问题,我想知道答案。 –

回答

5

代码*autodp1实际上是一个空指针的解引用。因此该代码展示未定义的行为。

您首先构造autodp1指向新分配的double。但是然后autodp2的构造函数为自己获取拥有的内存并将autodp1设置为null。

+0

好吧,那么我想这就是这个问题的答案。 谢谢@JurajBlaho –

+2

然后请标记它,所以Juraj得到适当的荣誉。 –

+0

对不起,我忘了,完成。 –

1

这是becouse的auto_ptr的运营商assignement采取的所有权(移动)指针

采取维基读,这是相当不错的一般解释:

http://en.wikipedia.org/wiki/Smart_pointer

“的拷贝构造函数和赋值std :: auto_ptr的操作符实际上并不复制已存储的指针,而是将其转移,而保留之前的std :: auto_ptr对象为空,这是实现严格所有权的一种方式,因此只有一个auto_ptr对象可以拥有指针任何给定的时间,这意味着auto_ptr不应该是用于需要复制语义的地方。“