1 #include <iostream> 2 #include <memory> 3 4 using namespace std; 5 6 class T 7 { 8 public: 9 T() 10 { 11 std::cout << "T()" << std::endl; 12 } 13 14 ~T() 15 { 16 std::cout << "~T()" << std::endl; 17 } 18 }; 19 20 int main() 21 { 22 { 23 T *t1 = new T(); 24 } 25 26 { 27 T *t2 = new T(); 28 std::shared_ptr<T> t3(t2); 29 } 30 31 return 0; 32 }
运行结果:
第28行就是将普通指针转换成了智能指针,出了作用域之后也成功析构了。
一个普通指针智能转化一次智能指针,之后的操作要在智能指针上进行。
代码:
1 #include <iostream> 2 #include <memory> 3 4 using namespace std; 5 6 class T 7 { 8 public: 9 T() 10 { 11 std::cout << "T()" << std::endl; 12 } 13 14 ~T() 15 { 16 std::cout << "~T()" << std::endl; 17 } 18 19 private: 20 int t[1024]; 21 }; 22 23 int main() 24 { 25 { 26 T *t1 = new T(); 27 } 28 29 { 30 T *t2 = new T(); 31 std::shared_ptr<T> t3(t2); 32 33 std::shared_ptr<T> t4(t2); 34 35 } 36 37 return 0; 38 }
类里面定义了一个数组,用于析构释放堆空间时复现问题,否则不容易复现。
运行结果:
31、33行会导致析构两次,产生了内存错误。