none
C++问题。编译启动出错 RRS feed

  • 问题

  • #include <iostream>
    using namespace std;
    class A
    {
    public:
     A()
     {
      x=new int;
      *x=5;
     }
     ~A()
     {
      delete x;
      x=NULL;
     }
     A(const A&a)
     {
      cout<<"复制构造函数执行中:"<<*x<<endl;
      x=a.x;
     }
     void prt()  const
     {
         cout<<*x<<endl;
     }
     void set(int i)
     {
      *x=i;
     }
    private:
     int *x;
    };
    int main()
    {
     A *j=new A();
     cout<<"J:";
     j->prt();
     cout<<endl;
     A b=(*j);
     b.prt();
     cout<<"J:";
     j->set(22);
     cout<<"B:";
     b.prt();
     cout<<endl;
     return 0;
    }

    用的是VC++2008 编译时无错误提示 ,但是编译执行后 程序遇到问题需要关闭 VISTA系统。。。
    我看VC6中就没有错误 而是在看他最后加了 delete j 程序才出错的。解释为   在析构了 j后 内存区域已经被删除 那么b被析构的时候就会找不到那快内存区域 而导致程序崩溃

    是什么原因 VC++2008 是否自动删除了 内存区域 j了? 还是啥
    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖
    2009年5月3日 9:19

答案

  • 朋友,我在VS2008中测试你的代码时仅仅遇到一下错误:
    Unhandled exception at 0x00921832 in Win32Console2.exe: 0xC0000005: Access violation reading location 0xcccccccc.
    在我删掉“cout<<"复制构造函数执行中:"<<*x<<endl;”后一点问题也没有。可以正常显示结果。楼主你可以试一下
    VisFans
    • 已标记为答案 dowflyon 2009年5月3日 15:07
    2009年5月3日 13:51

全部回复

  • 请问你在VS2008里是创建什么项目来编译这段代码的?
    VisFans
    2009年5月3日 12:08
  • 控制台空项目
    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖
    2009年5月3日 12:24
  • 朋友,我在VS2008中测试你的代码时仅仅遇到一下错误:
    Unhandled exception at 0x00921832 in Win32Console2.exe: 0xC0000005: Access violation reading location 0xcccccccc.
    在我删掉“cout<<"复制构造函数执行中:"<<*x<<endl;”后一点问题也没有。可以正常显示结果。楼主你可以试一下
    VisFans
    • 已标记为答案 dowflyon 2009年5月3日 15:07
    2009年5月3日 13:51
  • 的确是这样,是什么原因
    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖
    2009年5月3日 15:07
  • 如果你做仔细的debug,当你运行A b=(*j);时程序进入A(const A&a)
     {
      cout<<"复制构造函数执行中:"<<*x<<endl;
      x=a.x;
     }
    块执行,此时你如果监视一下*x会有CXX0030: Error: expression cannot be evaluated的错误提示,也就是此时访问x的值都会报错,而你程序中  cout<<"复制构造函数执行中:"<<*x<<endl;就访问了x地址存放的值。
    但这句语句:  x=a.x;你复制了传入的j指针中x的地址给x,于是x有值了,

    当你把这两句语句颠倒写,这样就没有错误了,所以我认为是因为x指针指向的地址里没有初始值导致的。

    VisFans
    • 已建议为答案 Myexp 2009年5月4日 12:34
    2009年5月4日 12:32