📄 crash47.c
字号:
// { dg-do assemble }// GROUPS passed old-abortconst int TRUE = 1;const int FALSE = 0;class Rep {protected: Rep(): count(0) { } Rep(const Rep& other): count(0) { } Rep& operator=(const Rep& other) { /* DO NOT copy over other.count */ return *this; }public: // TODO - for now // Because it is to hard to restrict these operations to the descendants // of Rep<REP> that we haven't named yet. So we just make them public. void inc() { count++; } void dec() { if (0 == --count) delete this; }private: unsigned count;};template<class REP>class Ref {public: Ref(): rep(0) { } Ref(const Ref<REP>& other): rep(other.rep) { if (rep) rep->inc(); } ~Ref() { if (rep) rep->dec(); rep = 0; } Ref<REP>& operator=(const Ref<REP>& other) { if (rep != other.rep) { if (rep) rep->dec(); rep = other.rep; if (rep) rep->inc(); } return *this; } bool null() const { return 0 == rep ? TRUE: FALSE; } bool valid() const { return 0 != rep ? TRUE: FALSE; } REP* operator->() const // should be a valid() reference { return rep; } operator REP*() const; // should be a valid() referenceprotected: REP *rep; Ref(REP *r): rep(r) { if (rep) rep->inc(); } Ref<REP>& operator=(REP *r) { if (rep != r) { if (rep) rep->dec(); rep = r; if (rep) rep->inc(); } return *this; }};template<class REP>Ref<REP>::operator REP*() const // should be a valid() reference{ return rep; }template<class REP> inline intoperator==(const Ref<REP>& a, const Ref<REP>& b){ return (REP *) a == (REP *) b; }template<class REP> inline intoperator!=(const Ref<REP>& a, const Ref<REP>& b){ return (REP *) a != (REP *) b; }class XRep: public Rep {public: int i;};intmain(){ Ref<XRep> y; return y != y;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -