IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 搜狗workflow——C++并行计算与异步网络引擎 序列化与反序列化 代码分析(四) -> 正文阅读

[C++知识库]搜狗workflow——C++并行计算与异步网络引擎 序列化与反序列化 代码分析(四)

2021SC@SDUSC

目录

一.基础知识

二.代码分析


一.基础知识

1.万能的指针:void *

我们可以认为void *就是一个通用指针,可以指向任意类型的指针。指针有两个属性:指向变量/对象的地址和长度,但是指针指存储被指向变量的地址,长度则取决于指针的类型,编译器根据指针的类型从指针指向的地址向后寻址,不同的类型则寻址范围不同,如int *从指定地址向后寻找4字节作为变量的存储单元。而void *不同,对于没有泛型编程的C语言来说,任何类型的指针都可以传入memcpymemset中,这也真实地体现了内存操作函数的意义,void*帮我们和编译器屏蔽了冗余的变量类型信息,而直接将内存暴露在我们面前。对于C++而言,对于某些范型可以实现的功能但又想找一种轻量化的实现方法,void*也不失为一种不错的选择。

2.this到底是什么

this 实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给 this。不过 this 这个形参是隐式的,它并不出现在代码中,而是在编译阶段由编译器默默地将它添加到参数列表中。

3.二级指针**--指向指针的指针。

4.msg类型

可以在任意的package中自定义msg类型;

要使用自定义的消息类型必须source自定义消息所在的工作空间,否则rosmsg show test_msgs/Test和rostopic echo /test_msg(/test_msg是节点中使用自定义消息类型test_msgs/Test的topic)都会报错,因为没有source的情况下自定义消息类型是不可见的,被认为是未定义类型

一种典型的错误是删掉工作空间下的devel和build文件夹之后重新编译代码,此时由于没有source自定义消息所在的工作空间,即使使用自定义消息的代码和自定义消息在同一个包也无法找到,该消息头文件,此时需要运行source devel/setup.bash之后重新编译就好。
?

5.free()函数

free()函数一般是和malloc()对应使用。malloc用来申请内存,而free用来释放内存。

1)free只是释放了malloc所申请的内存,并不改变指针的值;free的是vert_x所指向地址的内存。free只是释放了指针所指向地址的空间,本质上就是做了一些标记而已,所以指针及空间内容都还是存在的,只不过有隐患罢了。

2)free(vert_x)释放了vert_x指示的内存空间,vert_x这个指针变量本身仍然存在。这就是悬垂指针问题

3)由于指针所指向的内存已经被释放,所以其它代码有机会改写其中的内容,相当于该指针从此指向了自己无法控制的地方,也称为野指针;
4)为了避免失误,最好在free之后,将指针指向NULL。

6.Using用法

1.命名空间的使用

2.在子类中引用基类的成员

3、别名指定

二.代码分析

 

namespace protocol

{

class TutorialMessage : public ProtocolMessage

{

private:

virtual int encode(struct iovec vectors[], int max);

virtual int append(const void *buf, size_t size);

//定义encode和append方法实现序列化和反序列化。

public:

int set_message_body(const void *body, size_t size);

void get_message_body_nocopy(void **body, size_t *size)

{

*body = this->body;

*size = this->body_size;

}

//定义二级指针**body;*body指向body的地址,*size指向body_size的地址。

protected:

char head[4];

size_t head_received;

char *body;

size_t body_received;

size_t body_size;

//定义变量。

public:

TutorialMessage()

{

this->head_received = 0;

this->body = NULL;

this->body_size = 0;

}

//设置head_received的值为0;body的值为空;body_size的值为0。

TutorialMessage(TutorialMessage&& msg);

TutorialMessage& operator = (TutorialMessage&& msg);

virtual ~TutorialMessage()

{

free(this->body);

}

//用free()函数来释放内存。

};

using TutorialRequest = TutorialMessage;

using TutorialResponse = TutorialMessage;

}

//using别名指定。

-------------------------------------------------------------------------------------------------------------------------------

参考资料:

(54条消息) ROS自定义msg类型及使用_张京林要加油的技术专栏-CSDN博客

(54条消息) C++ 中using 的使用_私房菜-CSDN博客

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-29 12:49:03  更:2021-10-29 12:49:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:22:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码