我试图找出这段代码打印的内容,但由于某种原因无法输出,它给了我一个错误:“1 [main] Q1c 5752 open_stackdumpfile:将堆栈跟踪转储到Q1c.exe.stackdump ”。
double *dp=new double(1.2);
auto_ptr <double> autodp1(dp);
auto_ptr <double> autodp2=autodp1;
cout<<*autodp1<<endl;
我只是想知道它会打印什么,如果它甚至打印。
注意:这个问题出现在过去的试卷中,只是为了修改。
答案 0 :(得分:5)
代码*autodp1
实际上是空指针的解引用。因此代码表现出不确定的行为。
首先构建autodp1
以指向新分配的double
。但是autodp2
的构造函数为自己获取拥有的内存并将autodp1
设置为null。
答案 1 :(得分:1)
这是因为运营商对auto_ptr的分配取得了所有权(移动)指针
在Wiki上阅读,这是一个非常好的一般性解释:
http://en.wikipedia.org/wiki/Smart_pointer
“std :: auto_ptr的复制构造函数和赋值运算符实际上并不复制存储的指针。而是将它们传输,将前一个std :: auto_ptr对象留空。这是实现严格所有权的一种方法,这样只有一个auto_ptr对象可以在任何给定时间拥有指针。这意味着不应该在需要复制语义的地方使用auto_ptr。“