不解Ms-VC++6 下的 std::auto_prt 之怪现象?请教大虾了...

yecao_kinux 2003-06-20 04:20:05
//不解Ms-VC++6 下的 std::auto_prt 之怪现象?请教大虾了...
#include <iostream>
#include <memory>

class A
{
public:
A():_i(10)
{
std::cout<<"A::A()"<<std::endl;
}

~A()
{
std::cout<<"A::~A()"<<std::endl;
}

public:
int _i;
};

void main(void)
{
std::cout<<"Hello,the world!"<<std::endl;

std::auto_ptr<A> p1(new A);//A::A()
std::cout<<"p1=> p1->_i = "<<p1->_i<<std::endl;

std::auto_ptr<A> p2(new A);//A::A()
p2->_i = 20;
std::cout<<"p2=> p2->_i = "<<p2->_i<<std::endl;


std::cout<<"p2=p1 -> begin"<<std::endl;
p2 = p1;//A::~A()
p1->_i = 8;
std::cout<<"p2=p1 -> end"<<std::endl;

std::cout<<"p2=> p2->_i = "<<p2->_i<<std::endl;
std::cout<<"p1=> p1->_i = "<<p1->_i<<std::endl;

{
std::cout<<" Test p3 -> Begin "<<std::endl;
std::auto_ptr<A> p3 = p2;
std::cout<<"p3 = p2 -> end"<<std::endl;

std::cout<<"p1=> p1->_i = "<<p1->_i<<std::endl;
std::cout<<"p2=> p2->_i = "<<p2->_i<<std::endl;
std::cout<<"p3=> p3->_i = "<<p3->_i<<std::endl;

std::cout<<" Test p3 -> end "<<std::endl;
}//A::~A()

//在这之后为什么不出错?请教大虾
p1->_i = 100;
std::cout<<"p1->_i = 100"<<std::endl;
std::cout<<"p2=> p2->_i = "<<p2->_i<<std::endl;
std::cout<<"p1=> p1->_i = "<<p1->_i<<std::endl;

std::cout<<"The end!"<<std::endl;
}

/////////////////////////////////
//ms vc6 下运行结果
/*
Hello,the world!
A::A()
p1=> p1->_i = 10
A::A()
p2=> p2->_i = 20
p2=p1 -> begin
A::~A()
p2=p1 -> end
p2=> p2->_i = 8
p1=> p1->_i = 8
Test p3 -> Begin
p3 = p2 -> end
p1=> p1->_i = 8
p2=> p2->_i = 8
p3=> p3->_i = 8
Test p3 -> end
A::~A()//在这一步之前的结果都好理解,不解的是之后为什么不出错?
p1->_i = 100
p2=> p2->_i = 100
p1=> p1->_i = 100
The end!
Press any key to continue
*/
...全文
144 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yecao_kinux 2003-06-23
  • 打赏
  • 举报
回复
多谢!问题我已经有答案了
何哀何欢 2003-06-21
  • 打赏
  • 举报
回复
vc虽然对标准是不全面支持,但我认为一定是你的程序有问题。vc是目前最好的编译器。
fangrk 2003-06-20
  • 打赏
  • 举报
回复
我也不知道,反正VC6对标准支持得不好;更何况理想和现实总是有差距的:)
yecao_kinux 2003-06-20
  • 打赏
  • 举报
回复
对呀,在DevC++中,我们所料的结果相同:在做完p2 = p1;之后,p1->_i = 8;时就出错了.vc6下不是这样的,最难解的是在第二个A::~A()完之后,还运行

p1->_i = 100;//这之后的代码,为什么会这样?

fangrk 2003-06-20
  • 打赏
  • 举报
回复
p2 = p1;//A::~A()
p1->_i = 8;
就应该有问题了吧!
yecao_kinux 2003-06-20
  • 打赏
  • 举报
回复
dec c++ 中是可以和理的.我是说
std::cout<<"p2=p1 -> begin"<<std::endl;
p2 = p1;//A::~A()
std::cout<<"p2=p1 -> end"<<std::endl;
p2->_i = 9;
p1->_i = 8;//dev C++ 这一步就出错了//这和auto_prt的普遍意思相同
fangrk 2003-06-20
  • 打赏
  • 举报
回复
你有没有尝试过其它的编译器?
最好有两种编译器,这样可以避免因为单一编译器的“特性”而给你造成错觉。况且vc6对标准支持的不大好。
vc7或者borland c++ builder 6试试看

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧