diff --git a/unique_ptr_basics/Makefile b/unique_ptr_basics/Makefile new file mode 100644 index 0000000..c461b52 --- /dev/null +++ b/unique_ptr_basics/Makefile @@ -0,0 +1,22 @@ +# shared compiler configuration +include ../common.mk + +TARGET := unique_ptr_basics +SRCS := main.cpp +OBJS := $(SRCS:.cpp=.o) + +all: $(TARGET) + +$(TARGET): $(OBJS) + $(CXX) $(CXXFLAGS) -o $@ $^ + +%.o: %.cpp + $(CXX) $(CXXFLAGS) -c $< -o $@ + +run: $(TARGET) + ./$(TARGET) + +clean: + rm -f $(OBJS) $(TARGET) + +.PHONY: all clean run diff --git a/unique_ptr_basics/main.cpp b/unique_ptr_basics/main.cpp new file mode 100644 index 0000000..8af0197 --- /dev/null +++ b/unique_ptr_basics/main.cpp @@ -0,0 +1,64 @@ +#include +#include +#include + +class Resource { +public: + explicit Resource(int id) : id_(id) { + std::cout << "Resource " << id_ << " acquired\n"; + } + + ~Resource() { + std::cout << "Resource " << id_ << " released\n"; + } + + void use() const { + std::cout << "Using resource " << id_ << "\n"; + } + +private: + int id_; +}; + +// Factory function: returns ownership +std::unique_ptr make_resource(int id) { + return std::make_unique(id); +} + +// Takes ownership explicitly +void consume_resource(std::unique_ptr res) { + std::cout << "Consuming resource\n"; + res->use(); + // res is destroyed here +} + +// Borrows resource (no ownership transfer) +void inspect_resource(const Resource& res) { + std::cout << "Inspecting resource\n"; + res.use(); +} + +int main() { + std::cout << "=== create resource ===\n"; + auto r1 = make_resource(1); + + std::cout << "\n=== borrow resource ===\n"; + inspect_resource(*r1); + + std::cout << "\n=== move ownership ===\n"; + auto r2 = std::move(r1); + + if (!r1) { + std::cout << "r1 no longer owns the resource\n"; + } + + std::cout << "\n=== transfer ownership to function ===\n"; + consume_resource(std::move(r2)); + + if (!r2) { + std::cout << "r2 no longer owns the resource\n"; + } + + std::cout << "\n=== end of program ===\n"; + return 0; +} diff --git a/unique_ptr_basics/main.o b/unique_ptr_basics/main.o new file mode 100644 index 0000000..7c96071 Binary files /dev/null and b/unique_ptr_basics/main.o differ diff --git a/unique_ptr_basics/unique_ptr_basics b/unique_ptr_basics/unique_ptr_basics new file mode 100755 index 0000000..a29e624 Binary files /dev/null and b/unique_ptr_basics/unique_ptr_basics differ