fork(1) download
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <utility>
  4.  
  5.  
  6. template <typename T>
  7. struct default_delete {
  8. void operator ()(T *ptr) {
  9. delete ptr;
  10. }
  11. };
  12.  
  13. template <typename T, typename Deleter = default_delete<T>>
  14. class unique_ptr {
  15. public:
  16. unique_ptr(T* resource = nullptr, Deleter deleter = Deleter{})
  17. : resource{resource}, deleter{deleter} {}
  18.  
  19. unique_ptr(const unique_ptr&) = delete;
  20. unique_ptr(unique_ptr&& other)
  21. : resource{std::move(other.resource)},
  22. deleter{std::move(other.deleter)} {}
  23.  
  24. unique_ptr& operator=(const unique_ptr&) = delete;
  25. unique_ptr& operator=(unique_ptr&& other) {
  26. using std::swap;
  27. swap(other.resource, resource);
  28. swap(other.deleter, deleter);
  29. }
  30.  
  31. ~unique_ptr() {
  32. deleter(resource);
  33. }
  34.  
  35. T* get() { return resource; }
  36. const T* get() const { return resource; }
  37.  
  38. private:
  39. T* resource;
  40. Deleter deleter;
  41. };
  42.  
  43. int main() {
  44. // using default deleter
  45. unique_ptr<int> int_ptr(new int{});
  46.  
  47. // using std::free to delete dynamically allocated memory
  48. unique_ptr<int, void(*)(void *)> array_ptr(
  49. reinterpret_cast<int *>(std::malloc(5 * sizeof(int))),
  50. std::free);
  51.  
  52. // using std::fclose to close an opened file
  53. // You'll have to try this one localy - unable to open file on a server
  54. /*
  55.   unique_ptr<FILE, int(*)(FILE *)> file_ptr(
  56.   std::fopen("my_file.txt", "w"),
  57.   std::fclose);
  58.   //*/
  59. // use int_ptr, array_ptr, file_ptr here
  60.  
  61. // these resources get released here, at the end of scope
  62. }
  63.  
Success #stdin #stdout 0s 4464KB
stdin
Standard input is empty
stdout
Standard output is empty