new10.c

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

C
664
字号
#include "fail.h"
#pragma inline_depth(0);

#if __WATCOMC__ > 1060

void *save;
unsigned location;

struct X1 {
    long _x;
    X1(long u = 0) : _x(u) {}
    X1 *before_new() {
	return new X1;
    }
    void before_del( X1 *p , unsigned line ) {
	location = line;
	delete p;
    }
    ~X1() {}
    X1 *after_new() {
      return new X1;
    }
    void after_del( X1 *p , unsigned line ) {
	location = line;
	delete p;
    }
    void * operator new (size_t s) {
	void *p = ::operator new (s);
	save = p;
	return(p);
    }
    void operator delete (void *p, size_t __s) {
	if( __s != sizeof( X1 ) ) fail(location);
	if( p != save ) { fail( location ); return; }
	p = save;
	::operator delete (p);
    }
};

struct X2 {
    long _x;
    X2(long u = 0) : _x(u) {}
    X2 *before_new() {
	return new X2;
    }
    void before_del( X2 *p , unsigned line ) {
	location = line;
	delete p;
    }
    ~X2() {}
    X2 *after_new() {
      return new X2;
    }
    void after_del( X2 *p , unsigned line ) {
	location = line;
	delete p;
    }
    void * operator new (size_t s) {
	void *p = ::operator new (s);
	save = p;
	return(p);
    }
    void operator delete (void *p) {
	if( p != save ) { fail( location ); return; }
	p = save;
	::operator delete (p);
    }
};

struct X3 {
    long _x;
    X3 *before_new() {
	return new X3;
    }
    void before_del( X3 *p , unsigned line ) {
	location = line;
	delete p;
    }
    ~X3() {}
    X3 *after_new() {
      return new X3;
    }
    void after_del( X3 *p , unsigned line ) {
	location = line;
	delete p;
    }
    void * operator new (size_t s) {
	void *p = ::operator new (s);
	save = p;
	return(p);
    }
    void operator delete (void *p) {
	if( p != save ) { fail( location ); return; }
	p = save;
	::operator delete (p);
    }
};

struct X4 {
    long _x;
    X4 *before_new() {
	return new X4;
    }
    void before_del( X4 *p , unsigned line ) {
	location = line;
	delete p;
    }
    ~X4() {}
    X4 *after_new() {
      return new X4;
    }
    void after_del( X4 *p , unsigned line ) {
	location = line;
	delete p;
    }
    void * operator new (size_t s) {
	void *p = ::operator new (s);
	save = p;
	return(p);
    }
    void operator delete (void *p, size_t __s) {
	if( __s != sizeof( X4 ) ) fail(location);
	if( p != save ) { fail( location ); return; }
	p = save;
	::operator delete (p);
    }
};

int something;

struct DX1 {
    long _x;
    DX1(long u = 0) : _x(u) {}
    DX1 *before_new() {
	return new DX1;
    }
    void before_del( DX1 *p , unsigned line ) {
	location = line;
	delete p;
    }
    ~DX1() {++something;}
    DX1 *after_new() {
      return new DX1;
    }
    void after_del( DX1 *p , unsigned line ) {
	location = line;
	delete p;
    }
    void * operator new (size_t s) {
	void *p = ::operator new (s);
	save = p;
	return(p);
    }
    void operator delete (void *p, size_t __s) {
	if( __s != sizeof( DX1 ) ) fail(location);
	if( p != save ) { fail( location ); return; }
	p = save;
	::operator delete (p);
    }
};

struct DX2 {
    long _x;
    DX2(long u = 0) : _x(u) {}
    DX2 *before_new() {
	return new DX2;
    }
    void before_del( DX2 *p , unsigned line ) {
	location = line;
	delete p;
    }
    ~DX2() {++something;}
    DX2 *after_new() {
      return new DX2;
    }
    void after_del( DX2 *p , unsigned line ) {
	location = line;
	delete p;
    }
    void * operator new (size_t s) {
	void *p = ::operator new (s);
	save = p;
	return(p);
    }
    void operator delete (void *p) {
	if( p != save ) { fail( location ); return; }
	p = save;
	::operator delete (p);
    }
};

struct DX3 {
    long _x;
    DX3 *before_new() {
	return new DX3;
    }
    void before_del( DX3 *p , unsigned line ) {
	location = line;
	delete p;
    }
    ~DX3() {++something;}
    DX3 *after_new() {
      return new DX3;
    }
    void after_del( DX3 *p , unsigned line ) {
	location = line;
	delete p;
    }
    void * operator new (size_t s) {
	void *p = ::operator new (s);
	save = p;
	return(p);
    }
    void operator delete (void *p) {
	if( p != save ) { fail( location ); return; }
	p = save;
	::operator delete (p);
    }
};

struct DX4 {
    long _x;
    DX4 *before_new() {
	return new DX4;
    }
    void before_del( DX4 *p , unsigned line ) {
	location = line;
	delete p;
    }
    ~DX4() {++something;}
    DX4 *after_new() {
      return new DX4;
    }
    void after_del( DX4 *p , unsigned line ) {
	location = line;
	delete p;
    }
    void * operator new (size_t s) {
	void *p = ::operator new (s);
	save = p;
	return(p);
    }
    void operator delete (void *p, size_t __s) {
	if( __s != sizeof( DX4 ) ) fail(location);
	if( p != save ) { fail( location ); return; }
	p = save;
	::operator delete (p);
    }
};

struct VDX1 {
    long _x;
    VDX1(long u = 0) : _x(u) {}
    VDX1 *before_new() {
	return new VDX1;
    }
    void before_del( VDX1 *p , unsigned line ) {
	location = line;
	delete p;
    }
    virtual ~VDX1() {++something;}
    VDX1 *after_new() {
      return new VDX1;
    }
    void after_del( VDX1 *p , unsigned line ) {
	location = line;
	delete p;
    }
    void * operator new (size_t s) {
	void *p = ::operator new (s);
	save = p;
	return(p);
    }
    void operator delete (void *p, size_t __s) {
	if( __s != sizeof( VDX1 ) ) fail(location);
	if( p != save ) { fail( location ); return; }
	p = save;
	::operator delete (p);
    }
};

struct VDX2 {
    long _x;
    VDX2(long u = 0) : _x(u) {}
    VDX2 *before_new() {
	return new VDX2;
    }
    void before_del( VDX2 *p , unsigned line ) {
	location = line;
	delete p;
    }
    virtual ~VDX2() {++something;}
    VDX2 *after_new() {
      return new VDX2;
    }
    void after_del( VDX2 *p , unsigned line ) {
	location = line;
	delete p;
    }
    void * operator new (size_t s) {
	void *p = ::operator new (s);
	save = p;
	return(p);
    }
    void operator delete (void *p) {
	if( p != save ) { fail( location ); return; }
	p = save;
	::operator delete (p);
    }
};

struct VDX3 {
    long _x;
    VDX3 *before_new() {
	return new VDX3;
    }
    void before_del( VDX3 *p , unsigned line ) {
	location = line;
	delete p;
    }
    virtual ~VDX3() {++something;}
    VDX3 *after_new() {
      return new VDX3;
    }
    void after_del( VDX3 *p , unsigned line ) {
	location = line;
	delete p;
    }
    void * operator new (size_t s) {
	void *p = ::operator new (s);
	save = p;
	return(p);
    }
    void operator delete (void *p) {
	if( p != save ) { fail( location ); return; }
	p = save;
	::operator delete (p);
    }
};

struct VDX4 {
    long _x;
    VDX4 *before_new() {
	return new VDX4;
    }
    void before_del( VDX4 *p , unsigned line ) {
	location = line;
	delete p;
    }
    virtual ~VDX4() {++something;}
    VDX4 *after_new() {
      return new VDX4;
    }
    void after_del( VDX4 *p , unsigned line ) {
	location = line;
	delete p;
    }
    void * operator new (size_t s) {
	void *p = ::operator new (s);
	save = p;
	return(p);
    }
    void operator delete (void *p, size_t __s) {
	if( __s != sizeof( VDX4 ) ) fail(location);
	if( p != save ) { fail( location ); return; }
	p = save;
	::operator delete (p);
    }
};

struct NDX1 {
    long _x;
    NDX1(long u = 0) : _x(u) {}
    NDX1 *before_new() {
	return new NDX1;
    }
    void before_del( NDX1 *p , unsigned line ) {
	location = line;
	delete p;
    }
    ~NDX1() {++something;}
    NDX1 *after_new() {
      return new NDX1;
    }
    void after_del( NDX1 *p , unsigned line ) {
	location = line;
	delete p;
    }
    void * operator new (size_t s) {
	void *p = ::operator new (s);
	save = p;
	return(p);
    }
    void operator delete (void *p, size_t __s) {
	if( __s != sizeof( NDX1 ) ) fail(location);
	if( p != save ) { fail( location ); return; }
	p = save;
	::operator delete (p);
    }
};

struct NDX2 {
    long _x;
    NDX2(long u = 0) : _x(u) {}
    NDX2 *before_new() {
	return new NDX2;
    }
    void before_del( NDX2 *p , unsigned line ) {
	location = line;
	delete p;
    }
    ~NDX2() {++something;}
    NDX2 *after_new() {
      return new NDX2;
    }
    void after_del( NDX2 *p , unsigned line ) {
	location = line;
	delete p;
    }
    void * operator new (size_t s) {
	void *p = ::operator new (s);
	save = p;
	return(p);
    }
    void operator delete (void *p) {
	if( p != save ) { fail( location ); return; }
	p = save;
	::operator delete (p);
    }
};

struct NDX3 {
    long _x;
    NDX3 *before_new() {
	return new NDX3;
    }
    void before_del( NDX3 *p , unsigned line ) {
	location = line;
	delete p;
    }
    ~NDX3() {++something;}
    NDX3 *after_new() {
      return new NDX3;
    }
    void after_del( NDX3 *p , unsigned line ) {
	location = line;
	delete p;
    }
    void * operator new (size_t s) {
	void *p = ::operator new (s);
	save = p;
	return(p);
    }
    void operator delete (void *p) {
	if( p != save ) { fail( location ); return; }
	p = save;
	::operator delete (p);
    }
};

struct NDX4 {
    long _x;
    NDX4 *before_new() {
	return new NDX4;
    }
    void before_del( NDX4 *p , unsigned line ) {
	location = line;
	delete p;
    }
    ~NDX4() {++something;}
    NDX4 *after_new() {
      return new NDX4;
    }
    void after_del( NDX4 *p , unsigned line ) {
	location = line;
	delete p;
    }
    void * operator new (size_t s) {
	void *p = ::operator new (s);
	save = p;
	return(p);
    }
    void operator delete (void *p, size_t __s) {
	if( __s != sizeof( NDX4 ) ) fail(location);
	if( p != save ) { fail( location ); return; }
	p = save;
	::operator delete (p);
    }
};

int main() {
    X1 *p = new X1;
    location = __LINE__, delete p;
    X1 *q = new X1;
    location = __LINE__, delete q;
    {
	X1 *t = new X1;
	void *save_save = save;
	t->before_del( (t->before_new()), __LINE__ );
	t->after_del( (t->before_new()), __LINE__ );
	t->before_del( (t->after_new()), __LINE__ );
	t->after_del( (t->after_new()), __LINE__ );
	save = save_save;
	location = __LINE__, delete t;
    }
    {
	X2 *t = new X2;
	void *save_save = save;
	t->before_del( (t->before_new()), __LINE__ );
	t->after_del( (t->before_new()), __LINE__ );
	t->before_del( (t->after_new()), __LINE__ );
	t->after_del( (t->after_new()), __LINE__ );
	save = save_save;
	location = __LINE__, delete t;
    }
    {
	X3 *t = new X3;
	void *save_save = save;
	t->before_del( (t->before_new()), __LINE__ );
	t->after_del( (t->before_new()), __LINE__ );
	t->before_del( (t->after_new()), __LINE__ );
	t->after_del( (t->after_new()), __LINE__ );
	save = save_save;
	location = __LINE__, delete t;
    }
    {
	X4 *t = new X4;
	void *save_save = save;
	t->before_del( (t->before_new()), __LINE__ );
	t->after_del( (t->before_new()), __LINE__ );
	t->before_del( (t->after_new()), __LINE__ );
	t->after_del( (t->after_new()), __LINE__ );
	save = save_save;
	location = __LINE__, delete t;
    }
    {
	DX1 *t = new DX1;
	void *save_save = save;
	t->before_del( (t->before_new()), __LINE__ );
	t->after_del( (t->before_new()), __LINE__ );
	t->before_del( (t->after_new()), __LINE__ );
	t->after_del( (t->after_new()), __LINE__ );
	save = save_save;
	location = __LINE__, delete t;
    }
    {
	DX2 *t = new DX2;
	void *save_save = save;
	t->before_del( (t->before_new()), __LINE__ );
	t->after_del( (t->before_new()), __LINE__ );
	t->before_del( (t->after_new()), __LINE__ );
	t->after_del( (t->after_new()), __LINE__ );
	save = save_save;
	location = __LINE__, delete t;
    }
    {
	DX3 *t = new DX3;
	void *save_save = save;
	t->before_del( (t->before_new()), __LINE__ );
	t->after_del( (t->before_new()), __LINE__ );
	t->before_del( (t->after_new()), __LINE__ );
	t->after_del( (t->after_new()), __LINE__ );
	save = save_save;
	location = __LINE__, delete t;
    }
    {
	DX4 *t = new DX4;
	void *save_save = save;
	t->before_del( (t->before_new()), __LINE__ );
	t->after_del( (t->before_new()), __LINE__ );
	t->before_del( (t->after_new()), __LINE__ );
	t->after_del( (t->after_new()), __LINE__ );
	save = save_save;
	location = __LINE__, delete t;
    }
    {
	VDX1 *t = new VDX1;
	void *save_save = save;
	t->before_del( (t->before_new()), __LINE__ );
	t->after_del( (t->before_new()), __LINE__ );
	t->before_del( (t->after_new()), __LINE__ );
	t->after_del( (t->after_new()), __LINE__ );
	save = save_save;
	location = __LINE__, delete t;
    }
    {
	VDX2 *t = new VDX2;
	void *save_save = save;
	t->before_del( (t->before_new()), __LINE__ );
	t->after_del( (t->before_new()), __LINE__ );
	t->before_del( (t->after_new()), __LINE__ );
	t->after_del( (t->after_new()), __LINE__ );
	save = save_save;
	location = __LINE__, delete t;
    }
    {
	VDX3 *t = new VDX3;
	void *save_save = save;
	t->before_del( (t->before_new()), __LINE__ );
	t->after_del( (t->before_new()), __LINE__ );
	t->before_del( (t->after_new()), __LINE__ );
	t->after_del( (t->after_new()), __LINE__ );
	save = save_save;
	location = __LINE__, delete t;
    }
    {
	VDX4 *t = new VDX4;
	void *save_save = save;
	t->before_del( (t->before_new()), __LINE__ );
	t->after_del( (t->before_new()), __LINE__ );
	t->before_del( (t->after_new()), __LINE__ );
	t->after_del( (t->after_new()), __LINE__ );
	save = save_save;
	location = __LINE__, delete t;
    }
    {
	NDX1 *t = new NDX1;
	void *save_save = save;
	t->before_del( (t->before_new()), __LINE__ );
	t->after_del( (t->before_new()), __LINE__ );
	t->before_del( (t->after_new()), __LINE__ );
	t->after_del( (t->after_new()), __LINE__ );
	save = save_save;
	location = __LINE__, delete t;
    }
    {
	NDX2 *t = new NDX2;
	void *save_save = save;
	t->before_del( (t->before_new()), __LINE__ );
	t->after_del( (t->before_new()), __LINE__ );
	t->before_del( (t->after_new()), __LINE__ );
	t->after_del( (t->after_new()), __LINE__ );
	save = save_save;
	location = __LINE__, delete t;
    }
    {
	NDX3 *t = new NDX3;
	void *save_save = save;
	t->before_del( (t->before_new()), __LINE__ );
	t->after_del( (t->before_new()), __LINE__ );
	t->before_del( (t->after_new()), __LINE__ );
	t->after_del( (t->after_new()), __LINE__ );
	save = save_save;
	location = __LINE__, delete t;
    }
    {
	NDX4 *t = new NDX4;
	void *save_save = save;
	t->before_del( (t->before_new()), __LINE__ );
	t->after_del( (t->before_new()), __LINE__ );
	t->before_del( (t->after_new()), __LINE__ );
	t->after_del( (t->after_new()), __LINE__ );
	save = save_save;
	location = __LINE__, delete t;
    }
    _PASS;
}
#else
int main()
{
    _PASS;
}
#endif

⌨️ 快捷键说明

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