~AStruct() {cout<<"AStruct is deleted!"<<endl; } };structBStruct{std::shared_ptr<AStruct> APtr; ~BStruct() {cout<<"BStruct is deleted!"<<endl; } };voidTestLoopReference(){std::shared_ptr<AStruct>ap(new AStruct);std::shared_ptr<BStruct>bp(new BStruct); ap->bPtr = bp;...
my_shared_ptr(D * ptr): m_ptr(ptr), m_ref_count(new unsigned int(1)){ //这里拿到了类型D, 可用于初始化lambda并保存 auto deleter = [](T * ptr) {delete static_cast<D*>(ptr);}; m_deleter = deleter; } ... ~my_shared_ptr(){ ... m_deleter(m_ptr); } }; 这样我们也能...
std::shared_ptr<char> shr_p(p, [](char* p) {delete[] p; }); b. 不要对同一个内置指针通过构造函数或 reset函数生成多个智能指针对象 2、 weak_ptr 作用:是辅助观察shared_ptr,weak_ptr不会影响指针的释放,它的入参只能是shared_ptr或者weak_ptr,在shared_ptr对象全部销毁后,可以用过weak_ptr查看...
weak_ptr不会增加引用计数,它一般是与shard_ptr搭配使用,使用shared_ptr来构造weak_ptr,weak_ptr调用lock()方法,如果该shared_ptr已经被析构了,则返回null,如果还没被析构,则返回一个shared_ptr,并且该shared_ptr的引用计数加1。 引用C++的经典书籍《Effective C++》第三版中的一段话来感受下shared_ptr的优点 ...
shared_ptr<string>p1;//指向stringshared_ptr<list<int>> p2;//指向int的listif(p1 && p1->empty())*p1="h1"; 二、make_shared函数 最安全的分配和使用动态内存的方法就是调用该函数 此函数在内存中动态分配对象并初始化,返回此对象的shared_ptr ...
记一个非常诡异的关于 shared_ptr 的 bug 问题描述 今天写项目的时候遇见一个特别诡异的 bug,体现在在执行某条语句时,程序会莫名崩溃,并且给出的错误信息也非常难懂,只有一个malloc(): invalid size (unsorted)错误信息,从直观上看起来是 malloc 函数无法分配到内存,就想着应该是哪个动态分配内存...
shared_ptr<string>p2=make_shared<string>(10,'9'); //p3指向一个值初始化为0的int数 shared_ptr<int>p3=make_shared<int>(); 1. 2. 3. 4. 5. 6. 7. 8. 配合auto使用:make_shared函数可以赋值给auto,这样比较简单 autop=make_shared<vector<string>>(); ...
#include<memory>#include<iostream>struct Foo{Foo(int n=0)noexcept:bar(n){std::cout<<"Foo: constructor, bar = "<<bar<<'\n';}~Foo(){std::cout<<"Foo: destructor, bar = "<<bar<<'\n';}intgetBar()constnoexcept{returnbar;}private:int bar;};intmain(){std::shared_ptr<Foo>sptr...
使用std::weak_ptr修改上面的代码,可以将_prev和_next成员变量改为std::weak_ptr<ListNode>类型。这样可以避免循环引用,同时仍然可以访问链表中的前一个节点和后一个节点 struct ListNode{int _data;weak_ptr<ListNode> _prev;weak_ptr<ListNode> _next;~ListNode() { cout << "~ListNode()" << endl; }}...
示例3:使用 std::shared_ptr 实现链表 C++ #include<iostream>#include<memory>usingnamespacestd;// Define a singly linked list nodestructNode{intdata;shared_ptr<Node> next; Node(intval) : data(val) , next(NULL) { } };classLinkedList{public: ...