new1.c

来自「this is a gcc file, you can download it 」· C语言 代码 · 共 122 行

C
122
字号
//Lifetime of temporaries: //egcs 2.92 performs cleanup for temporaries inside new expressions//after the new is complete, not at the end of the full expression.#include <new>#include <cstdlib>#include <cstdio>bool new_throws;bool ctor_throws;int new_done;int ctor_done;int func_done;int dtor_done;int delete_done;int count;void init(){  new_throws = ctor_throws = false;  new_done = ctor_done = func_done = dtor_done = delete_done = count = 0;}struct line_error{  int line;  line_error(int i):line(i){}};#define CHECK(cond)  if(!(cond))throw line_error(__LINE__);struct A{  A(int){    ctor_done = ++count;    if(ctor_throws)      throw 1;  }  A(const A&){    CHECK(false); //no copy constructors in this code  }  ~A(){    dtor_done = ++count;  }  A* addr(){return this;}};struct B{  B(A*){}  void* operator new(size_t s){    new_done = ++count;    if(new_throws)      throw 1;    return malloc(s);  }  void operator delete(void *){    delete_done = ++count;  }};void func(B* ){  func_done = ++count;}void test1(){  init();  try{    func(new B(A(10).addr()));  }catch(int){  }  CHECK(new_done==1);  CHECK(ctor_done==2);  CHECK(func_done==3);  CHECK(dtor_done==4);  CHECK(delete_done==0);}void test2(){  init();  new_throws = true;  try{    func(new B(A(10).addr()));  }catch(int){  }  CHECK(new_done==1);  CHECK(ctor_done==0);  CHECK(func_done==0);  CHECK(dtor_done==0);  CHECK(delete_done==0);}void test3(){  init();  ctor_throws = true;  try{    func(new B(A(10).addr()));  }catch(int){  }  CHECK(new_done==1);  CHECK(ctor_done==2);  CHECK(func_done==0);  CHECK(dtor_done==0);  CHECK(delete_done==3);}int main(){  try{    test1();    test2();    test3();  }catch(line_error e){    printf("Got error in line %d\n",e.line);    return 1;  }  return 0;}

⌨️ 快捷键说明

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