Advertisement
Guest User

Untitled

a guest
Aug 24th, 2013
365
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.33 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. /* Параметры рисуемого многоугольника. Пока есть только число сторон. */
  5. struct PolyParams {
  6.     const volatile int vert_num;
  7.     PolyParams(int vert_num) : vert_num(vert_num) {}
  8.     PolyParams* defensiveCopy() { return new PolyParams(this->vert_num); }
  9. };
  10.  
  11. /* Эта функция находится где-нибудь в чужом коде*/
  12. void draw_poly(PolyParams* params) {;
  13.     volatile int *ptr;
  14.     //здесь не static_cast<int*>, потому что он не смог бы убрать type qualifiers
  15.     ptr = (int*)( &(params->vert_num) );
  16.     //это Undefined Behavior, но работает везде
  17.     *ptr = 5; // have a nice debug
  18. }
  19.  
  20. int main(int argc, char *argv[])
  21. {
  22.     PolyParams* pp = new PolyParams(3);
  23.  
  24.     //Изначально всё в порядке
  25.     printf( "three=%d\n", pp->vert_num );
  26.  
  27.     //Нарисуем защитную копию
  28.     PolyParams* dcpp = pp->defensiveCopy();
  29.     draw_poly(dcpp);
  30.     delete dcpp;
  31.  
  32.     //Все еще всё в порядке
  33.     printf( "three=%d\n", pp->vert_num );
  34.  
  35.     //А теперь нарисуем саму фигуру
  36.     draw_poly(pp);
  37.     //Кажется, что-то пошло не так
  38.     printf( "three=%d\n", pp->vert_num );
  39.     delete pp;     
  40.  
  41.     fgetchar();
  42.  
  43.     return 0;
  44. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement