File tree Expand file tree Collapse file tree 4 files changed +86
-0
lines changed
Expand file tree Collapse file tree 4 files changed +86
-0
lines changed Original file line number Diff line number Diff line change 1+ # shared compiler configuration
2+ include ../common.mk
3+
4+ TARGET := unique_ptr_basics
5+ SRCS := main.cpp
6+ OBJS := $(SRCS:.cpp=.o )
7+
8+ all : $(TARGET )
9+
10+ $(TARGET ) : $(OBJS )
11+ $(CXX ) $(CXXFLAGS ) -o $@ $^
12+
13+ % .o : % .cpp
14+ $(CXX ) $(CXXFLAGS ) -c $< -o $@
15+
16+ run : $(TARGET )
17+ ./$(TARGET )
18+
19+ clean :
20+ rm -f $(OBJS ) $(TARGET )
21+
22+ .PHONY : all clean run
Original file line number Diff line number Diff line change 1+ #include < iostream>
2+ #include < memory>
3+ #include < utility>
4+
5+ class Resource {
6+ public:
7+ explicit Resource (int id) : id_(id) {
8+ std::cout << " Resource " << id_ << " acquired\n " ;
9+ }
10+
11+ ~Resource () {
12+ std::cout << " Resource " << id_ << " released\n " ;
13+ }
14+
15+ void use () const {
16+ std::cout << " Using resource " << id_ << " \n " ;
17+ }
18+
19+ private:
20+ int id_;
21+ };
22+
23+ // Factory function: returns ownership
24+ std::unique_ptr<Resource> make_resource (int id) {
25+ return std::make_unique<Resource>(id);
26+ }
27+
28+ // Takes ownership explicitly
29+ void consume_resource (std::unique_ptr<Resource> res) {
30+ std::cout << " Consuming resource\n " ;
31+ res->use ();
32+ // res is destroyed here
33+ }
34+
35+ // Borrows resource (no ownership transfer)
36+ void inspect_resource (const Resource& res) {
37+ std::cout << " Inspecting resource\n " ;
38+ res.use ();
39+ }
40+
41+ int main () {
42+ std::cout << " === create resource ===\n " ;
43+ auto r1 = make_resource (1 );
44+
45+ std::cout << " \n === borrow resource ===\n " ;
46+ inspect_resource (*r1);
47+
48+ std::cout << " \n === move ownership ===\n " ;
49+ auto r2 = std::move (r1);
50+
51+ if (!r1) {
52+ std::cout << " r1 no longer owns the resource\n " ;
53+ }
54+
55+ std::cout << " \n === transfer ownership to function ===\n " ;
56+ consume_resource (std::move (r2));
57+
58+ if (!r2) {
59+ std::cout << " r2 no longer owns the resource\n " ;
60+ }
61+
62+ std::cout << " \n === end of program ===\n " ;
63+ return 0 ;
64+ }
You can’t perform that action at this time.
0 commit comments