标准库,智能指针,综合运用的小例子 功能说明:查询单词在文件中出现的次数,如果在同一行出现多次,只算一次. 比如查询单词:你好 输出的结果: 你好 出现了:2次 (行号 2)xxxxxxx 你好 (行号 3)bbb ccc 你好 xxxxx 注意点:代码的46行,必须使用引用. //非常重要,必须用引用,要不然就会拷贝一个新的set给lines,不是map里的set auto &lines = wm[word];//lines是shared_ptr 代码: #include <iostrea…
我们的程序使用内存包含以下几种: 静态内存用来保存局部static对象.类static数据成员以及定义在任何函数之外的变量,在使用之前分配,在程序结束时销毁. 栈内存用来保存定义在函数内部的非static对象,仅在其定义的程序块运行时才存在. 堆内存用来存储动态分配的对象,即那些在程序运行时分配的对象,动态对象的生存周期由程序控制,当动态对象不再使用时,我们的代码必须显式的销毁他们.   在c++中,普通对象离开它的作用域之后,它的的析构函数会自动调用,从而销毁这个对象,释放它所占用的内存,不会…
c++ auto_ptr智能指针 该类型在头文件memory中,在程序的开通通过 #include<memory> 导入,接下来讲解该智能指针的作用和使用. 使用方法: auto_ptr<type> ptr(new type());   这是该指针的定义形式,其中 type 是指针指向的类型,ptr 是该指针的名称. 比如该type 是int,具体定义如下: auto_ptr<int> ptr(new int(4)); 比如该type 是map<int,vecto…
问题:在上一篇继承与多态 文本查询的小例子(智能指针版本)在Query类里使用的是智能指针,只把智能指针换成普通的指针,并不添加拷贝构造方法,会发生什么呢? 执行时,代码崩掉. 分析下面一行代码: Query qb = ~Query("Alice"); 1,首先调用Query(string)的构造函数,把Query的成员q指向了new WordQuery(s) Query::Query(const std::string& s) : q(new WordQuery(s)){ s…
为了更好的理解继承和多态,做一个文本查询的小例子. 接口类:Query有2个方法. eval:查询,返回查询结果类QueryResult rep:得到要查询的文本 客户端程序的使用方法: //查询包含Daddy的文本所在的行 Query q("Daddy"); //查询不包含Alice的文本所在的行 Query q = ~Query("Alice"); //查询,有fiery或者bird的行 Query q = Query("fiery") |…
根据muduo开源库作者陈硕的一些文章.对于多线程下C++编程提出了一些观点.主要是多线程下对象的销毁比较困难,但是由于多线程下,mutext是无法保护析构的.而后提出了智能指针的方案并对使用该指针会遇到的困难和陷阱予以说明并提出解决方案. 该作者博客 http://www.cppblog.com/Solstice/ 这里主要说说shared_ptr,采用计数方案,计数为零则自动删除对象,不必自己调用delete.可以使用unique()及user_count()判断该指针是否唯一指针获取者,以…
c++11 智能指针 unique_ptr.shared_ptr与weak_ptr C++11中有unique_ptr.shared_ptr与weak_ptr等智能指针(smart pointer),定义在<memory>中. 可以对动态资源进行管理,保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终会被调用. unique_ptr unique_ptr持有对对象的独有权,同一时刻只能有一个unique_ptr指向给定对象(通过禁止拷贝语义.只有移动语义来实现). unique_ptr…
#include <iostream> #include <string> #include <memory> #include <functional> #include <map> #include <vector> #include <set> class Quote { friend double print_total(std::ostream &os, const Quote &item, st…
[1] string基础 [1.1] string 的构造 #include <iostream> #include <string> int main() { using namespace std; cout << "1 --- string(const char* s):将string对象初始化为s指向的C风格字符串" << endl; string one("benxintuzi_1"); cout <&…
写过C++的人都知道申请和释放内存组合new/delete,但同时很多人也会在写程序的时候忘记释放内存导致内存泄漏.如下所示: int _tmain(int argc, _TCHAR* argv[]) { ]; try{ strcpy(p,"hello"); } catch(int &e) { //.... ; } delete p; ; } 如果程序发生error而异常退出不会执行到最后的delete p,从而导致内存泄漏.于是程序员必须在所有分支都加上delete语句释放内…