fork download
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4.  
  5. typedef int HANDLE;
  6.  
  7. void DeleteHandle(HANDLE h)
  8. {
  9. cout << "deleting handle " << h << endl;
  10. }
  11.  
  12. template <class H>
  13. class UniqueHandle {
  14. H h;
  15.  
  16. public:
  17. UniqueHandle(H _h = 0)
  18. :h(_h) {}
  19.  
  20. UniqueHandle(const UniqueHandle &other)
  21. :h(const_cast<UniqueHandle&>(other).YieldOwnership()) {}
  22.  
  23. ~UniqueHandle() { ::DeleteHandle(h); }
  24.  
  25. UniqueHandle &operator =(const UniqueHandle &other)
  26. {
  27. this->~UniqueHandle(); // release the old handle
  28. h = const_cast<UniqueHandle&>(other).YieldOwnership();
  29. return *this;
  30. }
  31.  
  32. UniqueHandle &operator =(H _h)
  33. {
  34. this->~UniqueHandle(); // release the old handle
  35. h = _h;
  36. return *this;
  37. }
  38.  
  39. H YieldOwnership() { H result = h; h = 0; return result; }
  40.  
  41. operator H() const { return h; }
  42. };
  43.  
  44. int main()
  45. {
  46. UniqueHandle<HANDLE> h(123);
  47. UniqueHandle<HANDLE> h2 = 456;
  48. HANDLE unmanaged = 789;
  49. HANDLE mixed_case = (rand() & 1)? (HANDLE)h : unmanaged;
  50. DeleteHandle(unmanaged);
  51. return 0;
  52. }
Success #stdin #stdout 0s 3340KB
stdin
Standard input is empty
stdout
deleting handle 789
deleting handle 456
deleting handle 123