C++服务器框架开发2——头文件memory/typedef

该专栏记录了在学习一个开发项目的过程中遇到的疑惑和问题。
其教学视频见:[C++高级教程]从零开始开发服务器框架(sylar)

上一篇:C++服务器框架开发1——项目介绍/分布式/#ifndef与#pragma once

C++服务器框架开发2——头文件memory/typedef

  • 目前进度
  • memory
  • typedef

目前进度

目前第一个视频中的log.h编写还没学完,进度如下图。
要点:

  1. 这几个类定义都写在namespace里,这是为了避免不同头文件的命名冲突。
  2. 其中的LogAppender的析构函数被定义成虚函数了,因为日志输出地方可能有很多种,到时候就需要用到子类来继承这个父类,所以它的析构函数要设置成虚的。这是考虑到内存泄露问题。简单的讲就是:假设没有写virtual,然后定义了一个基类指针来指向动态的子类,当delete指针时,只会执行基类的析构函数不执行子类的,这就会导致子类中的堆内存没有被释放。而写了virtual的话,则会先执行子类的析构函数,再执行父类的析构函数。可以参考这两篇文章:文章1和文章2。
  3. LogEvent类中,定义变量时进行了初始化,这是符合C++11规范的。

在这里插入图片描述

memory

memory是个标准库,我查了下,它有很多种指针和分配器。从上图的学习进度可以看到,shared_ptr就是其中一种共享指针。对于它的功能描述,如下:

  1. “shared_ptr 共享指针,初始化后同指针一样指向一个对象,成员函数use_count() 表示有多少共享指针指向对象,每当shared_ptr被赋值、拷贝的时候,use_count()加1,一个共享指针不再指向对象时,use_count减1。以这种方式构造的,指向同一个对象的指针,use_count是共享的。”
  2. “shared_ptr 主要的功能是,管理动态创建的对象的销毁。它的基本原理就是记录对象被引用的次数,当引用次数为 0 的时候,也就是最后一个指向某对象的共享指针析构的时候,共享指针的析构函数就把指向的内存区域释放掉。” 代码示例:
#ifndef __HELLOWORLD__
#define __HELLOWORLD__
#include <iostream>
#include <memory>
#include <assert.h>
#endif int main() {std::shared_ptr<int> sp(new int(10));                //一个指向整数的shared_ptr    assert(sp.unique());                            //现在shared_ptr是指针的唯一持有者     std::shared_ptr<int> sp2 = sp;                       //第二个shared_ptr,拷贝构造函数     assert(sp == sp2 && sp.use_count() == 2);       //两个shared_ptr相等,指向同一个对象,引用计数为2    *sp2 = 100;                                     //使用解引用操作符修改被指对象    assert(*sp == 100);                             //另一个shared_ptr也同时被修改     sp.reset();                                     //停止shared_ptr的使用    assert(!sp);                                    //sp不再持有任何指针(空指针)return 0;
}

typedef

参考自文章3,文章讲得很细,这里我把一些重点的搬运过来。
“任何声明变量的语句前面加上typedef之后,原来是变量的都变成一种类型。”
我的理解就是,用typedef来给某种类型的变量或函数起个名字,然后后面当你需要声明这种类型的变量或函数时,你就可以用这个名字,而无需再写各种复杂的规范描述。下面是文章给的例子,看例子及其注释加深下理解。

//变量
typedef int NUM;
NUM a = 10; // 也可写成`NUM(a) = 10;`
NUM(b) = 12; // 也可写成`NUM b = 12;`//函数
typedef int f(); // 定义一个名为f, 参数为空, 返回值为int的函数类型
typedef int g(int); // 定义一个名为g, 含一个int参数, 返回值为int行的函数类型//应用
#include <iostream>
#include <stdio.h>
#include <string>
typedef int P(); // 简单的
typedef void Q(int *p, const std::string& s1, const std::string& s2, size_t size, bool is_true); // 复杂的
class X {
public:P(eat_shit); // 等价于声明`int eat_shit();`Q(bullshit); // 等价于声明`void bullshit(int *p, const string& s1, const string& s2, size_t size, bool is_true);`
};int main() {X *xx;printf("shit ret: %d\n", xx->eat_shit());int a[] = {1, 3, 4, 5, 7};xx->bullshit(a, "foo", "bar", sizeof(a)/sizeof(int), true);
}int X::eat_shit() {return 888;
}void X::bullshit(int *p, const std::string& s1, const std::string& s2, size_t size, bool is_true) {std::cout << "s1: " << s1 << ", s2: " << s2 << ", size: " << size << std::endl;printf("elems:\n");for(int i = 0; i < size; i++) {printf("%d %s",  *p++, (i == size-1) ? "" : ",");}printf("\n");
}

回到这个开发项目来。进度图中的第12行,定义了一个名字为ptr的共享指针,这个共享指针是LogEvent类的。
在这里插入图片描述
我还没看后面的代码,但据我的理解,定义这个ptr,可能是因为后面可能需要用很多这种指针,并且不同的类需要定义不同的类的指针,如果能用ptr指代,写代码就方便多了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/142685.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

python抽签小程序

用python的random函数做一个班级抽签小程序 import random times1 while times < 5:members \[张俊宇,孙晓涵,黄皓, 黄媛媛,张仁鹏,班正平,闭玉婷,陆腾辉,高伟,黄锦鸿,姜小雪,苏慧芳,吴锦婷,谢晓桐,莫成妮,农诗佳,韦凯英,韦肖怡,安元光,卢崇竣,程俊龙,麻晨,仲湛秋,李宗树,农…

如何将python代码生成exe小程序

​我研究过很多办法&#xff0c;pyinstaller是最合适的。 安装pyinstaller&#xff1a; pip install pyinstaller 而如果要使用则使用如下指令&#xff1a; pyinstaller -F [文件名.py] --noconsole 使用上述指令&#xff0c;可以在dist文件夹实现一个单独的exe小程序的生…

简单的python小程序祝福母亲,母亲节快乐!

简单的python小程序祝福母亲&#xff0c;母亲节快乐&#xff01; 今天是星期天&#xff0c;也是母亲节&#xff0c; 不禁意识到二十二岁的我如此年轻&#xff0c;四十多岁的母亲似乎不再年轻。 今天编写了一个简单的python小程序。 代码如下&#xff0c;仅供参考。 import …

python简单小程序-Python程序员,如何快速开发一个小程序

要点&#xff1a; 小程序是前后端分离的。 前端使用的是微信自定义的一套规范wxmlwxssjsonjs&#xff0c;本质还是htmlcssjs。 后台可以选用任何你熟悉的语言&#xff1a;Java,Python,PHP,Ruby等等&#xff0c;在这篇文章里我选用Python的Flask框架GunicornNginx来快速搭建。…

【爆赞】这款Python小程序自动抠图只需5秒,秒杀PS手动抠图?

导语 大家好&#xff01;我是木木子&#xff0c;今天天气不是很好&#xff0c;下雨了&#xff0c;让我没点儿写文章的动力啊~ 写程序&#xff1a;一天到晚没事做&#xff0c;一行代码改一天&#xff0c;从白天学完天黑&#xff01; 在日常的工作和生活中&#xff0c;我们经常…

app小程序手机端Python爬虫实战11实现自动化登录考研帮app并滑动资讯信息

作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 实现自动化登录考研帮app并滑动资讯信息 一、最终的实现 二、清楚数据 首先需要清除软件数据,这样广告才会出来 其他设置=》应用程序管理=》已安装=》找到考研帮=》清除数据三、设置模拟…

python的那些小程序(绘图)

python的那些小程序&#xff08;绘图&#xff09; 一、python的那些小程序绘制五角星绘制万花筒绘制字符画 二、总结三、参考文献 一、python的那些小程序 绘制五角星 import turtlespiral turtle.Turtle()for i in range(20):spiral.forward(i * 10)spiral.right(144)turtl…

Python之程序调试

Python之程序调试 一、前言二、使用自动的IDLE进行程序调试三、使用assert 语句调试程序 一、前言 在程序开发过程中&#xff0c;免不了会出现一些错误&#xff0c;有语法方面的&#xff0c;也有逻辑方面的。对于语法方面的错误比较好检测&#xff0c;因为程序会直接停止&#…

第一个Python小程序(Hello World!)

当安装好python时&#xff0c;可以在命令提示符中直接输入 python 就可以进入python自带的编辑器&#xff08;最好不要使用root用户&#xff0c;因为当你不小心把数据给删了&#xff0c;那可不是一般罪过啊&#xff01;&#xff09;&#xff0c;如图&#xff1a; 此时就可…

Python 小程序 绘制 小蛇

好激动&#xff0c;终于接触到关于图形知识&#xff0c;(^__^*) 嘻嘻…… 一、程序代码 二、程序分析 绘制等边三角形 import turtledef drawSnake():turtle.fd(200)turtle.seth(120)turtle.fd(200)turtle.seth(240)turtle.fd(200)def main():turtle.setup(500, 500, 0, 0)pyth…

实战|轻松用 Python 开发一个简单有趣的聊天小程序

前言 Internet 协议集支持一个无连接的传输协议&#xff0c;该协议称为用户数据报协议&#xff08;UDP&#xff0c;User Datagram Protocol&#xff09;。 UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。 UDP 的特性&#xff1a;它不属于连接型协议&…

Real-Time C++ 嵌入式C++ 程序设计(三)

翻译自 Real-Time C Efficient Object-Oriented and Template Microcontroller Programming 4th Edition - Kormanyos, Christopher&#xff0c;这书涉及了从C11 到C20 的内容&#xff0c;主要介绍使用C 的模板、面向对象等特性设计嵌入式程序。书里的示例代码都是公开的&#…

python控制微信小程序,python+appium微信小程序自动化实现

一、安装Appium 二、Appium SDK配置 三、chromedriver驱动路径配置及appium启动 1.查看X5内核版本 微信小程序是基于goole的webview 做了封装了,叫x5内核,所以跟chrome浏览器定位元素一样,需要配置chromedriver.exe, 通过 Uc-devtools 工具可以识别到 Chrome是什么版本,再…

Python--微信小程序简单爬取

一、微信小程序获取要求&#xff1a; 获取前10页的内容&#xff0c;并保存 二、准备分析工作 1、先进入微信小程序页面&#xff0c;url http://www.wxapp-union.com/&#xff1b; 2、进入首页&#xff0c;右击检查&#xff0c;或f12,如图&#xff1b; 3、获取第一页的url&…

Python+微信小程序开发(一)了解和环境搭建

一、小程序介绍 1.什么是微信小程序&#xff1f; 移动互联网时代&#xff0c;手机手机软件&#xff0c;在手机上中安装很多软件腾讯和阿里&#xff08;只安装自己不用别人&#xff09; 腾讯&#xff1a;微信 N小程序阿里&#xff1a;支付宝 N小程序 2.为什么要做小程序&am…

Python 作为小程序后端的三种方法

你好&#xff0c;我是征哥。微信的小程序是一个很不错的体验&#xff0c;简单&#xff0c;上手快&#xff0c;这几天也在学习使用小程序&#xff0c;自己总结了三种用 Python 作为小程序后端的方式&#xff0c;供你参考。 方法一、微信的云托管[1]。 优点&#xff1a;不需要购买…

python微信小程序爬虫_Python爬取微信小程序实战(通用)

背景介绍 最近遇到一个需求&#xff0c;大致就是要获取某个小程序上的数据。心想小程序本质上就是移动端加壳的浏览器&#xff0c;所以想到用Python去获取数据。在网上学习了一下如何实现后&#xff0c;记录一下我的实现过程以及所踩过的小坑。本文关键词&#xff1a;Python&a…

python如何运行?第一个python小程序示范

我们想要用python编程首先要做的就是安装一些工具&#xff0c;随后学会应用。那么问题来了&#xff0c;我们需要安装什么&#xff1f;python又是怎样运行的呢&#xff1f; 安装什么工具&#xff1f; 1、Python 3.6.5&#xff08;我安装的&#xff0c;还有很多版本&#xff09…

python写一个完整的小程序_写一个python小程序

在windows环境下进行操作 window+R 输入cmd 创建一个文件夹 mkdir pytxt 创建一个py文件 py.py 用notepad或者记事本等工具进行编辑 或 首先声明python3.5以后没有中文乱码,已经支持中文,就像java的jdk1.6以后都支持中文一样。 进入python交互环境下然后可以进行数据运算,…

整理了适合新手的20个Python练手小程序

100个Python练手小程序&#xff0c;学习python的很好的资料&#xff0c;覆盖了python中的每一部分&#xff0c;可以边学习边练习&#xff0c;更容易掌握python。 本文附带基础视频教程&#xff1a;私信回复【基础】就可以获取的 【程序1】 题目&#xff1a;有1、2、3、4个数字&…