智能指针
C++ 11 模板库的 <memory> 头文件中定义的智能指针,即 shared_ptr 模板类,用来管理指针的存储,提供有限的内存回收函数,可同时与其他对象共享该管理功能
std::unique_ptr ,它保证了所指向的对象只有一个拥有者。
get():返回指向对象的原始指针,如果需要的话,可以使用此原始指针访问对象。
release():释放所有权,返回指向对象的原始指针,并将std::unique_ptr置为空。
reset():释放当前拥有的对象,并可以选择性地采用新的对象。
operator bool():检查std::unique_ptr是否为空。
operator*() 和 operator->:提供对对象的访问。
std::shared_ptr ,它允许多个指针指向同一个对象,并在无任何拥有者时自动删除对象。
.get()
void swap (shared_ptr& x) noexcept
场景
在程序中将远程传来的字节流进行结构化,或者将结构化的数据变成字节流传给远程主机。
函数功能
01. std::memcpy 定义于头文件 <cstring>
void* memcpy( void* dest, const void* src, std::size_t count );
从 src 所指向的对象复制 count 个字符到 dest 所指向的对象。两个对象都被转译成 unsigned char 的数组
src指向复制来源对象的指针 dest 指向要复制的对象的指针
is_trivially_copyable (C++11) 检查类型是否可平凡复制
02. c_str()就是将C++的string转化为C的字符串数组
C中没有string,所以函数c_str()就是将C++的string转化为C的字符串数组,c_str()生成一个const char *指针,指向字符串的首地址
使用strcpy()函数 等来操作方法c_str()返回的指针
// c_str()返回一个客户程序可读不可改的指向字符数组的指针,不需要手动释放或删除这个指针。
strcpy(c,s.c_str());
03.std::shared_ptr提供了一个名为.get()的成员函数,该函数用于获取指向对象的原始指针。
调用.get()时,它返回指向由std::shared_ptr管理的对象的原始指针
04. void*中的void代表一个任意的数据类型,"星号"代表一个指针,所以其就是一个任意数据类型的指针
当void*作为函数的参数类型或者返回值类型时,说明该函数可以接收或者返回任意类型的指针
void表示无值,在指针前,则说明该指针指向不确定,因此该指针可以指向任意类型的变量,
但如果直接输出指向内容,会报错,需要在输出时将其进行显示类型转换
void*表示“任意类型的指针”或表示“该指针与一地址值相关,但是不清楚在此地址上的对象的类型”
05. memcpy((void *)&abstruct,(void *)RxBuffer,4);
std::shared_ptr<Type> info = std::make_shared<Type>()
bytestring ="bytesting";
memcpy((void *)&info.get(),(void *)bytestring.c_str(),4);
06.数据类型转换
隐式类型转换和显式类型转换
(void *) (char *) const_cast<char *>()
隐式类型
隐式类型转换由编译器自动完成
显式类型转换
C++ 引入了四种功能不同的强制类型转换运算符以进行强制类型转换。
const_cast dynamic_cast static_cast reinterpret_cast
1.const_cast : 运算符用于修改类型的 const / volatile 属性。
除了 const 或 volatile 属性之外,目标类型必须与源类型相同。这种类型的转换主要是用来操作所传对象的 const 属性,可以加上 const 属性,也可以去掉 const 属性
const_cast() 将常量变量转换为可赋值的变量,但注意,原来的常量名称的值不会被改变。因为在预编译阶段,将常量转换为真实数字,就如同宏定义的常量一样
2. dynamic_cast: 在运行时执行转换,验证转换的有效性。如果转换未执行,则转换失败,表达式则被判定为 null
3. static_cast :进行普通数据类型转换,用于两个相关类型之间的转换
4. reinterpret_cat
可以将一个指针类型转换为另一个指针类型,即使转换前后的数据类型不同。
它不检查指针类型和指针所指向的数据是否相同。它的字面意思是“重新诠释”
内容
结构体成员对齐
大于8位数据类型的大小端存储方式
1)结构体的起始地址能被n整除 (2)结构体的总大小能被n整除 当说到一个成员变量是n字节对齐的,说明该变量的起始地址能被n整除
memcpy((void *)&abstruct,(void *)RxBuffer,4);
固定字节数
c_str是Borland封装的String类中的一个函数,它返回当前字符串的首字符地址
说明
在C/C++程序中,结构化数据通常用结构体来组织,结构体也能够方便的转换为字节流,因此结构化的数据传输本不该成为问题,
但在VC或GCC的默认设置下编译出的程序,却有一个值得注意的问题——结构体的对齐。
结构体的对齐是编译器为加快程序运行,在结构体中填入一些空白字节,是的结构体成员按一定规则对齐。
排查故障
Segmentation Fault"(段错误)。Segmentation Fault是指当程序访问了未经允许的内存区域时发生的错误
debug:
gbd b r n p
数据集合
containers
map返回key值对应的value值,有2种方法:可以利用 find(key)->second来获取; 直接利用 map[key] 来获取;
共享内存
shm 共享内存(Shared Memory)是一种进程间通信(IPC,Inter-Process Communication)的方式
CyberRT 数据用共享内存发布时,首先会创建 ShmTransmitter 对象,
包含两个主要成员segment和notifier,
Segment用于创建共享内存(上面绿色部分),
Notifer 最终构建ReadableInfo通知给其他进程。
使用哪个ConditionNotifier-> notify或MulticastNotifier->notify,是在创建时根据配置文件决定的
参考
memcpy并发场景下、srclen < dstlen出现的问题 https://blog.csdn.net/John_ToStr/article/details/130081173
https://blog.csdn.net/yt_42370304/article/details/134562798
C++ 11 智能指针——shared_ptr类成员函数详解 https://www.cnblogs.com/JCpeng/p/15031742.html