【Smart_Point】动态内存与智能指针
动态内存
动态内存使用的三种原因
- 程序不知道自己需要多少对象
- 程序不知道所需对象的准确类型
- 程序需要在多个对线之间共享数据
文章目录
- 动态内存
- 动态内存使用的三种原因
- 实例1: Exercise 12.2:
- Write your own version of the StrBlob class including the const versions of front and back.
- test
- Exercise 12.6:
- Exercise 12.7: Redo the previous exercise, this time using shared_ptr.
定义StrBlob类如下Exercise 12.2
StrBlob():data(std::make_shared<vector<string>>()) { }StrBlob(std::initializer_list<string> il):data(std::make_shared<vector<string>>(il)) { }
2个构造函数都是用初始化成员列表来初始化data成员,令data指向一个动态分配的vector. 默认构造分配一个空的vector,然后接受一个initializer_list的构造函数通过拷贝列表中的值来初始化vector元素。
如下实例1:所示 check私有工具函数,做索引检查,处理异常参数。
StrBlob 只有一个数据成员,当StrBlob 发生拷贝,赋值或者销毁StrBlob 对象时候,它的shared_ptr成员也会拷贝,赋值或者销毁。
拷贝一个shared_ptr会递增其引用计数,当将一个shared_ptr赋值给另外一个shared_ptr时候,等号右边的shared_ptr会递增其引用计数,等号左边的shared_ptr会递减其引用计数。
实例1: Exercise 12.2:
Write your own version of the StrBlob class including the const versions of front and back.
#include <vector>
#include <string>
#include <initializer_list>
#include <memory>
#include <exception>using std::vector; using std::string;class StrBlob {
public:using size_type = vector<string>::size_type;StrBlob():data(std::make_shared<vector<string>>()) { }StrBlob(std::initializer_list<string> il):data(std::make_shared<vector<string>>(il)) {}size_type size() const { return data->size(); }bool empty() const { return data->empty(); }void push_back(const string &t) { data->push_back(t); }void pop_back() {check(0, "pop_back on empty StrBlob");data->pop_back();}std::string& front() {check(0, "front on empty StrBlob");return data->front();}std::string& back() {check(0, "back on empty StrBlob");return data->back();}const std::string& front() const {check(0, "front on empty StrBlob");return data->front();}const std::string& back() const {check(0, "back on empty StrBlob");return data->back();}private:void check(size_type i, const string &msg) const {if (i >= data->size()) throw std::out_of_range(msg);}private:std::shared_ptr<vector<string>> data;
};
test
#include "ex12_02.h"
#include <iostream>int main()
{const StrBlob csb{ "hello", "world", "pezy" };StrBlob sb{ "hello", "world", "Mooophy" };std::cout << csb.front() << " " << csb.back() << std::endl;sb.back() = "pezy";std::cout << sb.front() << " " << sb.back() << std::endl;
}
Exercise 12.6:
Write a function that returns a dynamically allocated vector of ints.
Pass that vector to another function that reads the standard input to give values to the elements.
Pass the vector to another function to print the values that were read. Remember to delete the vector at the appropriate time.
#include <iostream> #include <vector>
using namespace std;auto make_dynamically()
{return new vector<int>{};
}auto populate(vector<int>* vec)
{for (int i = 0; i < 4;i++)vec->push_back(i);return vec;
}auto print(vector<int>* vec) -> std::ostream&
{for (auto i : *vec) std::cout << i << " ";return std::cout;
}int main()
{auto vec = populate(make_dynamically());print(vec) << std::endl;delete vec;getchar();return 0;
}
Exercise 12.7: Redo the previous exercise, this time using shared_ptr.
#include <iostream> #include <vector> #include <memory>1
using namespace std;auto make_with_shared_ptr()
{return make_shared<vector<int>>();
}auto populate(shared_ptr<vector<int>> vec)
{for (int i = 0; i < 4; ++i)vec->push_back(i);return vec;
}auto print(shared_ptr<std::vector<int>> vec) -> std::ostream&
{for (auto i : *vec) std::cout << i << " ";return std::cout;
}int main()
{auto vec = populate(make_with_shared_ptr());print(vec) << std::endl;getchar();return 0;
}
相关文章:

JS中的null和undefined,undefined为啥用void 0代替?
起因 某天,在看某位同学的js代码,代码中发现了一个奇怪的东西 void 0,虽然第一眼看不懂这是什么东西,但是根据上下文,这里应该是想判断是否等于undefined,为什么要这样写的,有什么渊源吗?顺便就把undefined和null都拿出来复习了一下. 介绍 undefined和null是js中类型七种数据类…

【Smart_Point】动态内存与智能指针实战:文本查询程序(设计set,map,智能指针的应用)
文章目录Cpp读入结构性数组文本查询程序文本查询程序本版1Cpp读入结构性数组 #include<sstream> #include<iostream> #include<string>std::vector<cv::Point2f> point_calibartion_position;std::string filename "C:/Users/Administrator/Des…

我眼中的DevOps(转)
过去一年以来,一批来自欧美的、不墨守陈规的系统管理员和开发人员一直在谈论一个新概念:DevOps。DevOps 就是开发(Development)和运维(Operations)这两个领域的合并。(如果没错的话,…
【阿圆实验】Consul HA 高可用方案
一、建立Consul Cluster环境 利用Consul提供的服务实现服务的注册与发现,需要建立Consul Cluster。在Consul方案中,每个提供服务的节点上都要部署和运行Consul的agent,所有运行Consul agent节点的集合构成Consul Cluster。Consul agent有两种…

【C++】拷贝,赋值与构造
拷贝,赋值与构造 文章目录拷贝,赋值与构造1. 拷贝构造函数/合成拷贝构造函数(copy constructor)2. 拷贝赋值运算符3. 析构函数1. 拷贝构造函数/合成拷贝构造函数(copy constructor) 1.1 定义:复…

Java 内存查看与分析
2019独角兽企业重金招聘Python工程师标准>>> 1:gc日志输出 在jvm启动参数中加入 -XX:PrintGC -XX:PrintGCDetails -XX:PrintGCTimestamps -XX:PrintGCApplicationStopedTime,jvm将会按照这些参数顺序输出gc概要信息,详细信息&…

玩转Vuejs--核心原理
一、摘要: Vuejs是一款前端MVVM框架,利用Vuejs、webpack以及周边一系列生态工具我们可以快速的构建起一个前端应用,网上对于Vue的分析大都是基于各个模块,理解起来不够顺畅,本文将从整个执行过程出发,讲一下…

【C++】拷贝控制与资源管理
1. 拷贝控制与资源管理 管理类外资源的类必须定义拷贝控制成员。如P447中所见,这种类需要通过析构函数来释放对象所分配的资源。一旦一个类需要析构函数,那么几乎可确定它也需要一个拷贝构造函数和一个拷贝赋值函数。 明确拷贝语义:可以定义…

leangoo V5.4.2版上线
本次更新增加了“卡片编辑面板内显示成员、截止日期、工作量”的功能。同时我们也进行了大量的功能优化,以下是此次更新详情: 1. 新增“卡片编辑面板内显示成员、截止日期、工作量”功能 本次更新后 ,您在卡片编辑面板内添加成员,…

差分边缘检测实现
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/opencv.hpp> using namespace cv; // 图像差分操作 void diffOperation(const cv::Mat srcImage, cv::Mat& edgeXImage,cv::Mat& edgeYImage) {cv::Mat…

2.1:CGPROGRAM
文章著作权归作者所有。转载请联系作者,并在文中注明出处,给出原文链接。 本系列原更新于作者的github博客,这里给出链接。 前言 经过前面两个章节的铺垫,我们对渲染以及Unity Shaderlab相关的知识已经有了大概的认识,…

【OpenCV】OpenCV中积分图函数与应用
OpenCV中积分图函数与应用 参考资料 opencv 查找integral,目前网上大部分的资料来自于opencv https://docs.opencv.org/master/d7/d1b/group__imgproc__misc.html#gadeaf38d7701d7ad371278d663c50c77dhttps://blog.csdn.net/jia20003/article/details/52710751ht…

django学习笔记【003】创建第一个带有model的app
【1】python应用程序要连接mysql有多个驱动程序可供选择: 1、MySQLdb 这个只支持python2.x 所以在这里就不说了; 2、mysqlclient 下载地址 https://pypi.python.org/pypi/mysqlclient/1.3.9 3、MySQL Connector/python 这个是mysql官方主推的mysql驱…

图像非极大值抑制 Sobel 边缘实现
bool SobelVerEdge(cv::Mat srcImage, cv::Mat& resultImage) {CV_Assert(srcImage.channels() 1);srcImage.convertTo(srcImage, CV_32FC1);// 水平方向的 Sobel 算子cv::Mat sobelx (cv::Mat_<float>(3,3) << -0.125, 0, 0.125,-0.25, 0, 0.25,-0.125, 0, …

第四次作业 (日期和jieba库的运用)
设计题1: 设计一个本月份日历,输出格式如下: 要求: 1.初始化start_day,end_day两个日期 from datetime import datetime start_daydatetime(2019,4,1) end_daydatetime(2019,4,30) 其它时间数据生成要用datetime或date…

【C++】LINK类型错误分析记录
LINK类型错误 情况1: 根据生成路径,查找是否成功生成静态库/动态库,一般在./bin文件中。 情况2: 是否在CMakeLists中target_link_libraries中添加链接静态库操作 情况3: 是都存在类模板,需要实例化&a…

eBay宣布发布全新的购买和销售APIs
eBay最近宣布发布两款全新的购买和销售APIs。这些APIs旨在促进eBay产品在第三方应用程序中的更好集成。eBay于10月19日在他们的博客上发表了几篇文章,不仅详细介绍了这些全新的购买和销售APIs提供的功能,而且还详细地总结了他们公司从SOAP(简…

Sobel 边缘实现
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include "opencv2/imgproc/imgproc.hpp" #include <iostream> using namespace cv; // 非极大值抑制实现sobel竖直细化边缘 bool SobelVerEdge(cv::Mat srcImage, cv::…

vue下实现textarea类似密码框的功能之探索input输入框keyup,keydown,input事件的触发顺序...
项目中引入element的input框组件,触发事件必须要加上.native <el-input placeholder"请输入" type"textarea" v-model"valueText" keyup.native"keyUp(valueText,$event)" keydown.native"keyDown($event)" …

【C++】动态内存管理/move/以及移动构造与移动赋值运算符
文章目录1 .对象移动与右值引用 实际应用过程中遇到的问题及其解决方案c中临时变量不能作为非const的引用参数2. 动态内存管理类3. 对象移动与右值引用4. 移动构造与移动复制运算符1 .对象移动与右值引用 实际应用过程中遇到的问题及其解决方案 问题描述: bool Cr…

图像直接卷积 Sobel 边缘实现
bool sobelEdge(const cv::Mat& srcImage, cv::Mat& resultImage,uchar threshold) {CV_Assert(srcImage.channels() 1);// 初始化水平核因子Mat sobelx (Mat_<double>(3, 3) << 1, 0,-1, 2, 0, -2, 1, 0, -1);// 初始化垂直核因子Mat sobely (Mat_&…

JSON.parse解析特殊字符报错解决方案
2019独角兽企业重金招聘Python工程师标准>>> 具体案例: 页面点击”下一任务” 会去请求后台,这里出现的问题是有虚拟任务的时候。然后会返回一个map,也就是如下图中回调函数中的data。 当该map里存有以下字符的时候: \…

MySQL数据库字符集和整理
MySQL数据库字符集和整理(2009-11-20 22:23:37)mysql数据库 it 其实这个表在MySQL数据库中通过phpMyAdmin就能看到,icech只是把表格整理了一下方便大家使用,如果要更换数据库的字符集,心里有数。其中有三种utf8_general_ci、utf8_unicode_ci…

【SLAM后端】—— ceres优化相机位姿求解
求解结果如下: mat 初始化,eigenvalue初始化 Mat K ( Mat_<double> ( 3,3 ) << 520.9, 0, 325.1, 0, 521.0, 249.7, 0, 0, 1 );Eigen::Matrix<float,3,1> vd_3d;v_3d << 3, 2, 1;求解目标函数结构体构造与实例 struct CurveFi…

SPOJ 1811 LCS [后缀自动机]
题意: 求两个串的最大连续子串 一个串建SAM,另一个串在上面跑 注意如果走了Suffix Link,sum需要更新为t[u].val1 Suffix Link有点像失配吧,当前状态s走不了了就到Suffix Link指向的状态fa上去,fa是s的后缀所以是可行的…

图像卷积下非极大值抑制 Sobel 的实现
bool sobelOptaEdge(const cv::Mat& srcImage, cv::Mat& resultImage, int flag) {CV_Assert(srcImage.channels() 1);// 初始化sobel水平核因子cv::Mat sobelX (cv::Mat_<double>(3, 3) << 1, 0, -1,2, 0, -2, 1, 0, -1);// 初始化sebel垂直核因子cv::…

was unable to refresh its cache! status = Cannot execute request on any known server
出现这种错误是因为: Eureka服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为。 在 yml中设置 eureka.client.register-with-eurekafalse eureka.client.fetch-registryfalse 但在服务端是要这是为false的,在客…

【C++】浅析析构函数(基类中)为什么要写成虚基类?
为什么有了虚析构函数,就能先调用子类的析构函数? class A {virtual ~A(){} };class B : A {virtual ~B(){} };A *p new B(); delete p; 唯一差别是,每个析构函数结束时会自动(隐含地)调上父类的析构函数࿰…

Roberts 边缘检测
#include <opencv2/opencv.hpp> // roberts算子实现 cv::Mat roberts(cv::Mat srcImage) {cv::Mat dstImage srcImage.clone();int nRows dstImage.rows;int nCols dstImage.cols;for (int i 0; i < nRows - 1; i){for (int j 0; j < nCols - 1; j){// 根据公…

vector、map删除当前记录
map<string, string> sMap; map<string, string>::iterator iter; for(iter sMap.begin();iter ! sMap.end();/* iter */) {sMap.erase(iter); }注意下列错误表达:1. for(iter sMap.begin();iter ! sMap.end(); iter ) {sMap.erase(iter); } 错误原因…