1.shared_ptr<T> ptr;//ptr 的意义就相当于一个 NULL 指针 2.shared_ptr<T> ptr(new T());//从new操作符的返回值构造 3.shared_ptr<T> ptr2(ptr1); // 使用拷贝构造函数的方法,会让引用计数加 1 //shared_ptr 可以当作函数的参数传递,或者当作函数的返回值返回,这个时候其实也相当于使用拷贝构造...
make_shared函数会返回一个shared_ptr<int> 类型的对象,这个对象赋值给ptr。 2.2 管理类对象示例 下面的示例中shared_ptr管理了一个list。 #include <iostream> #include <list> #include <string> #include <memory> using namespace std; struct Student { Student(const string& name, int age); Student(co...
由上面可知,当指向一个对象的最后一个shared_ptr对象被销毁时,shared_ptr类会自动销毁此对象。shared_ptr类是通过析构函数来完成销毁工作的 内存浪费:因为只有在销毁掉最后一个shared_ptr时,该指针所指向的内存才会释放,因此如果你忘记了销毁程序不再需要的shared_ptr,程序仍然正在执行,那么就造成内存浪费 六、shared...
voidrunGame(){std::shared_ptr<Monster>monster1(newMonster());//计数加到1do{std::shared_ptr<Monster> monster2 = monster1;//计数加到2}while(0);//该栈退出后,计数减为1,monster1指向的堆对象仍存在std::shared_ptr<Monster> monster3 = monster1;//计数加到2}//该栈退出后,shared_ptr都释放...
string和的简单实现shared_ptr将为 分配三个不同的内存shared_ptr<string const>: 字符串缓冲区的内存 字符串对象的内存 引用计数的内存 现在,我知道在使用 时std::make_shared(),智能实现可以将后两者合并为一个分配。但这仍然会留下两个分配。 当您知道字符串是不可变的时,字符串缓冲区将不会被重新分配,因...
智能指针之shared_ptr基本概述 1.shared_ptr允许有多个指针指向同一个对象,unique_ptr独占所指向的对象。 2.类似于vector,智能指针也是模板。创建智能指针: 1shared_ptr<string> p1;//指向string的shared_ptr2shared_ptr<list<int>> p2;//指向int的list的shared_ptr...
#include<iostream>#include<memory>intmain(){auto*p=newstd::string("hello");std::shared_ptr<std::string>sp1(p);/*不要这样做!!*/std::shared_ptr<std::string>sp2(p);return0;} 这样会导致两个shared_ptr管理同一个对象,当其中一个被销毁时,其管理的对象会被销毁,而另外一个销毁时,对象会二次...
shared_ptr<string> p1; // shared_ptr,能够指向string shared_ptr<list<int>> p2; // shared_ptr,能够指向int的list 1. 2. 默认初始化的智能指针中保存着一个空指针。 智能指针的使用方式与普通指针类似。解引用一个智能指针返回它指向的对象。
所以“改用shared_ptr”一般是整个项目的技术决策者来把握的事情,这里面还有要求“团队成员都要掌握正确使用shared_ptr方法”的成本。本身delete this和shared_ptr是冲突的。virtual void destroy() { delete this; } 对于字符串操作,就要求我们尽量不要用 std::string、CString 这样现成的东西,而是使用 strncpy、...
shared_ptr是一个模版类,在声明时必须声明指向对象的类型:上面的代码只是定义了一个空的shared_ptr,如果需要同时初始化,最安全的方式是使用make_shared标准库函数:之所以说这种方式安全,我想是因为make_shared虽然也生成了MyString对象,但是这个对象直接装配到shared_ptr上,利用侧根本摸不着。赋值 我们也可以把一...