dtor28.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 90 行

C
90
字号
// 11.0
//		works? _=yes
// -d2i -xst	_
// -d2i -xs 	_
// -d2i -xss	_
// -d2  -xst	N
// -d2  -xs 	_
// -d2  -xss	_
// -d1  -xst	N
// -d1  -xs 	_
// -d1  -xss	_
#include "fail.h"
#include <string.h>

unsigned s_dtor;

struct S {
    S *next;
    static S *freed;
    void *operator new( unsigned s )
    {
	return new char[s];
    }
    void operator delete( void *p ) {
	S *t = (S*)p;
	for( S *c = freed; c; c = c->next ) {
	    if( c == t ) fail(__LINE__);
	}
	t->next = freed;
	freed = t;
    }
    S( int x ) : x(x) {
    }
    int x;
    ~S() {
	++s_dtor;
    }
    void zap() {
	memset( this, -1, sizeof(*this) );
    }
};
S *S::freed;

unsigned once;

struct L {
    S *h;
    ~L() {
	S *n;
	if( once++ == 0 ) {
	    for( S *c = h; c; c = n ) {
		n = c->next;
		c->zap();
		delete c;
		throw 1;	// h will point to freed memory!
	    }
	} else {
	    // should only be called once
	    fail(__LINE__);
	}
    }
    void add( int v ) {
	S *p = new S(v);
	p->next = h;
	h = p;
    }
    L() : h(0) {
    }
};

void test() {
    L xx;

    xx.add(1);
    xx.add(2);
    xx.add(3);
}

int main() {
    static int ok;
    try {
	test();
    } catch( ... ) {
	++ok;
    }
    if( s_dtor != 1 ) fail(__LINE__);
    if( !ok ) fail(__LINE__);
    _PASS;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?