c++-这个 shared_ptr 在使用的时候为什么要 reset?

问题描述

这个 shared_ptr 在使用的时候为什么要 reset?
 class Query_result;
class Text_query {
public:
    using line_no = vector<std::string>::size_type;
    Text_query(ifstream&);
    Query_result query(const string&) const;
private:
    shared_ptr<vector<string>> file;
    map<string, shared_ptr<set<line_no>>> wm;//这里
};

Text_query::Text_query(ifstream &is) : file(new vector<string>)
{
    string text;
    while (getline(is, text)) {
        file->push_back(text);
        int n = file->size() - 1;
        istringstream line(text);
        string word;
        while (line >> word)
        {
            auto &lines = wm[word];
            if (!lines)
                lines.reset(new set <line_no>);//这里
            lines->insert(n);
        }
    }
}

《C++ Primer》第五版,中文版。 433 页。书上的解释看不明白。

解决方案

在这里:
 auto &lines = wm[word];
 当wm已有关键字为word的一项时,智能指针已指向一个set<line_no>对象,此时line非空,无需reset;
  当wm没有关键字为word的一项时,智能指针为空,此时line为空,通过reset释放原先的内存空间(此处为空,相当于没有释放),再指向new set <line_no>开辟的内存空间。

解决方案二:

带参数的reset(使得原指针引用计数减1的同时改为管理另一个指针。

解决方案三:

使用 shared_ptr
C++中shared_ptr的使用
shared_ptr使用

时间: 2024-09-06 20:47:18

c++-这个 shared_ptr 在使用的时候为什么要 reset?的相关文章

shared_ptr线程安全性全面分析_C 语言

正如<STL源码剖析>所讲,"源码之前,了无秘密".本文基于shared_ptr的源代码,提取了shared_ptr的类图和对象图,然后分析了shared_ptr如何保证文档所宣称的线程安全性.本文的分析基于boost 1.52版本,编译器是VC 2010. shared_ptr的线程安全性boost官方文档对shared_ptr线程安全性的正式表述是:shared_ptr对象提供与内置类型相同级别的线程安全性.[shared_ptrobjects offer the sa

perl-请问怎么破?。。。。。

问题描述 请问怎么破?..... #include #include #include #include #include #include #include #include #include using namespace std; typedef vector::size_type line_no; class queryresult; class textquery{ public: textquery(ifstream &) { }; queryresult query(string

MongoDB3.2.5源码分析(一)

MogonDB3.2.5是一个较为稳定的版本,出于工作需要,对其源码进行了相应研究. 代码结构: 进入db目录,重点分析MongoDB的启动过程,进入db.cpp: // @file db.cpp : Defines main() for the mongod program. /** * Copyright (C) 2008-2014 MongoDB Inc. * * This program is free software: you can redistribute it and/or m

g++ 4.7 如果不使用c++11的标准不能使用shared_ptr吗?

问题描述 g++ 4.7 如果不使用c++11的标准不能使用shared_ptr吗? RT 在g++4.7的版本中如果编译时不指定-std=c++11 则不能识别shared_ptr吗? #include #include using namespace std; int main() { shared_ptr< int > p = NULL; //编译不过啊 } 解决方案 C++中shared_ptr的使用使用 shared_ptrboost::shared_ptr的多线程使用陷阱 解决方案

多线程读写 shared_ptr需要加锁的原因

我在<Linux 多线程服务端编程:使用 muduo C++ 网络库>第 1.9 节"再论 shared_ptr 的线程 安全"中写道: (shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化.根据文档 (http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafety), shared_ptr 的

c++的问题-关于类的成员变量指向在堆上的对象的选择:指针/auto_ptr&amp;amp;lt;&amp;amp;gt;/shared_ptr&amp;amp;lt;&amp;amp;gt; ?

问题描述 关于类的成员变量指向在堆上的对象的选择:指针/auto_ptr<>/shared_ptr<> ? 在堆上的对象作为一个类的一个成员变量,我了解到的至少有三种方式(如下所示): class A{ } class B{ A* m_pA1; auto_ptrm_pA2: shared_ptrm_pA3: } B::B():m_pA1(new A)m_pA2(auto_ptr(new A))m_pA3(shared_ptr(new A)){ } 针对这三种方案,在什么情况下选择哪

c#怎么处理C++ dll中的shared_ptr参数

问题描述 c#调用c++dll,dll函数有shared_ptr参数,怎么处理,谢谢 解决方案 解决方案二:用intptr接收就可以.解决方案三:引用1楼devmiao的回复: 用intptr接收就可以. 接受后,怎么使用,例如:c++:structStudent{intage;intid;}voidfun(shared_ptr<Student>pStu);c#:publicexternstaticvoidfun(IntPtrptr);//ptr怎么用,谢谢解决方案四:几乎无法使用,除非你能了

C++:为什么unique_ptr的Deleter是模板类型参数,而shared_ptr的Deleter不是?

为什么unique_ptr的Deleter是模板类型参数,而shared_ptr的Deleter不是? template <class T, class D = default_delete<T>> class unique_ptr { public: ... unique_ptr (pointer p, typename conditional<is_reference<D>::value,D,const D&> del) noexcept; ..

boost学习之--shared_ptr

 在boost中,有一个智能指针类shared_ptr可以管理好我们的指针.这里我不详解,以下列出使用例子.自己现写现调通过的哈: #include <iostream> #include <boost/shared_ptr.hpp> #include <boost/make_shared.hpp> using namespace std; using namespace boost; class Person { public: Person(string name,