免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1752 | 回复: 5
打印 上一主题 下一主题

[C++] 段错误,请坛友帮忙看看 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-08 19:46 |只看该作者 |倒序浏览
#include <iostream>
#include <string>
using namespace std;
class Expr;

class Expr_node
{
&nbsp;&nbsp;&nbsp;&nbsp;public:
&nbsp;&nbsp;&nbsp;&nbsp;    virtual void print(ostream&) const = 0;

&nbsp;&nbsp;&nbsp;&nbsp;protected:
&nbsp;&nbsp;&nbsp;&nbsp;    friend ostream& operator<<(ostream& o, const Expr_node& e)
&nbsp;&nbsp;&nbsp;&nbsp;    {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    e.print(o);
&nbsp;&nbsp;&nbsp;&nbsp;        return o;
&nbsp;&nbsp;&nbsp;&nbsp;    }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;    friend class Expr;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int use;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Expr_node(): use(1){ };
&nbsp;&nbsp;&nbsp;&nbsp;    virtual ~Expr_node(){ };
};

class Expr
{
&nbsp;&nbsp;&nbsp;&nbsp;private:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;friend ostream& operator<<(ostream& o, const Expr& e)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.p->print(o);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return o;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;protected:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Expr_node* p;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;friend class Expr_node;

&nbsp;&nbsp;&nbsp;&nbsp;public:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Expr(int);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Expr(const string&, Expr);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Expr(const Expr&);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Expr& operator=(const Expr&);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~Expr();
};

class Int_node: public Expr_node
{
&nbsp;&nbsp;&nbsp;&nbsp;public:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;friend class Expr;
&nbsp;&nbsp;&nbsp;&nbsp;    int n;
&nbsp;&nbsp;&nbsp;&nbsp;    Int_node(int k): n(k){ }
&nbsp;&nbsp;&nbsp;&nbsp;    void print(ostream& o) const
&nbsp;&nbsp;&nbsp;&nbsp;    { o << n; }
};

class Unary_node: public Expr_node
{
&nbsp;&nbsp;&nbsp;&nbsp;public:
&nbsp;&nbsp;&nbsp;&nbsp;    friend class Expr;
&nbsp;&nbsp;&nbsp;&nbsp;    string op;
&nbsp;&nbsp;&nbsp;&nbsp;    Expr uni;
&nbsp;&nbsp;&nbsp;&nbsp;    Unary_node(string a, Expr b):op(a), uni(b){ };
&nbsp;&nbsp;&nbsp;&nbsp;    void print(ostream& o) const
&nbsp;&nbsp;&nbsp;&nbsp;    {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    o << "(" << op << uni << ")";
&nbsp;&nbsp;&nbsp;&nbsp;    }
};

Expr::Expr(int n)
{
&nbsp;&nbsp;&nbsp;&nbsp;p = new Int_node(n);
};

Expr::Expr(const string& op, Expr t)
{
&nbsp;&nbsp;&nbsp;&nbsp;p = new Unary_node(op, t);
};

Expr::Expr(const Expr& t)
{ p = t.p; ++p->use;}

Expr& Expr::operator=(const Expr& rhs)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rhs.p->use++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (--p->use == 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete p;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = rhs.p;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return *this;
};

Expr::~Expr()
{ delete p;}

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;string plus = "+";
&nbsp;&nbsp;&nbsp;&nbsp;Expr *t;
&nbsp;&nbsp;&nbsp;&nbsp;t = new Expr(5);
&nbsp;&nbsp;&nbsp;&nbsp;cout << *t <<endl;
&nbsp;&nbsp;&nbsp;&nbsp;Expr s(*t);
&nbsp;&nbsp;&nbsp;&nbsp;cout << Expr(plus,s )<< endl;
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

论坛徽章:
0
2 [报告]
发表于 2009-01-08 19:50 |只看该作者
错误在
cout << Expr(plus,s )<< endl;

论坛徽章:
0
3 [报告]
发表于 2009-01-08 20:03 |只看该作者
原帖由 eveson 于 2009-1-8 19:50 发表
错误在
cout  


#include   <string>  
#include   <iostream>  
using   namespace   std;  
class   Expr;  
class   Expr_node      
{  
public:
    virtual void print(ostream&) const = 0;
protected:
    friend class Expr;
    friend ostream& operator << (ostream& o, const Expr_node& e)  
    {
        e.print(o);  
        return   o;  
    };
    Expr_node():use(1){};  
    virtual   ~Expr_node(){};  
    int use;   //for   count   the   number;  

};  

class   Expr  
{   
protected:
    friend   class   Expr_node;  
    friend   ostream&   operator<<(ostream&   o,   const   Expr&   t)
    {
        t.p->print(o);
        return   o;
    }  
public:
    Expr(int n);
    Expr(const string& op, Expr t);
    Expr(const Expr& t);
    Expr&   operator=(const   Expr&   rhs);
    ~Expr();
protected:
    Expr_node *p;
};  
  
class Int_node: public Expr_node
{
    public:
        Int_node(int k):n(k){};
    protected:
        void print(ostream& o) const
        {
            o << n;
        };
    private:
        friend class Expr;
        int n;
};  
   
class Unary_node:public Expr_node
{
    protected:
        friend class Expr;
        string op;
        Expr opnd;
        void print(ostream& o) const
        {
            o << "(" << op << opnd << ")";
        };
    public:
        Unary_node(const string& a, Expr b):op(a),opnd(b){}
};  

Expr::Expr(int n){p = new Int_node(n);}

Expr::Expr(const string& op, Expr t)
{
    p= new Unary_node(op,t);
}  

Expr::Expr(const Expr& t)
{
    p = t.p;
     ++p->use;
};  

Expr& Expr::operator=(const Expr& rhs)
{
    rhs.p->use++;
    if(--p->use == 0)
      delete p;
    p = rhs.p;
    return *this;
};  

Expr::~Expr()
{
    if(--p->use == 0)
      delete p;
};

int   main(void)  
{
    string temp = "+";
    Expr *t;
    t = new Expr(5);
    cout << *t <<endl;
    Expr s(*t);
    cout << Expr("-",s )<< endl;
    return 0;
}   

一楼的代码运行时有段错误,同样的main下的代码,用这一段可以通过,请大家帮忙看看一楼的问题出在什么地方,谢谢了!

论坛徽章:
0
4 [报告]
发表于 2009-01-10 00:03 |只看该作者
大致看了一下,应该是Expr::~Expr()函数有问题,你既然是用Expr_node::use来维持一个引用计数,当然在delete一个Expr_node类型的变量的时候要判断引用计数是否为0,只有引用计数为0的时候才能正真的释放空间
Expr::~Expr()
{
    p->use--;
    if(!p->use){
        delete p;
    }
}
这样写就不会出现这个问题了,

这样改了之后在Expr& Expr:perator=(const Expr& rhs)函数里面应该也有点问题,个人感觉在这个函数里面不应该减少引用计数

论坛徽章:
0
5 [报告]
发表于 2009-01-10 00:04 |只看该作者
没看下面的帖子,楼主自己已经改了

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
6 [报告]
发表于 2009-01-10 12:07 |只看该作者
大段大段的代码只有有空的同志才会帮助你的。
也有即使有空也懒得帮你。

要学会自己调试。。
在gdb里bt一下看看最近调用的函数,再认真看看。(这只是其中的一点)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP