数据存储
文章平均质量分 75
Anurmy
这个作者很懒,什么都没留下…
展开
-
c++ 单例模式
单例模式单例模式有两种,懒汉和饿汉懒汉:故名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化。与之对应的是饿汉式单例。(注意,懒汉本身是线程不安全的)饿汉:饿了肯定要饥不择食。所以在单例类定义的时候就进行实例化。(本身就是线程安全的)1 线程安全、内存安全的懒汉式单例 (智能指针,锁)#include <iostream>#include <memory> // shared_ptr#include <mutex> //原创 2022-02-19 17:38:46 · 103 阅读 · 0 评论 -
c++ 工厂设计模式
1 定义所谓简单工厂模式,是一种实例化对象的方式,只要输入需要实例化对象的名字,就可以通过工厂对象的相应工厂函数来制造你需要的对象。简单工厂模式的核心是,对于一个父类的多个继承子类,工厂对象的工厂函数根据用户输入,自动new出一个子类对象并返回其父类的指针,这样利用父类的指针执行父类的虚函数,就可以动态绑定子类的重写函数,从而实现多态。2 代码实现#ifndef __SIMPLEFACTORY__H#define __SIMPLEFACTORY__H#include <iostream&原创 2022-02-19 15:20:36 · 716 阅读 · 0 评论 -
placement new
1什么是placement new?所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可。举例来说:class foo{};foo* pfoo = new foo;pfoo指向的对象的地址你是不能决定的,因为new已经为你做了这些工作。第一步分配内存,第二步调用类的构造函数。而placement new是怎么做的呢,说白了就是把原本new做的两步工作分开来。第一步你自己分配内存,第二步你调用类的构造函数在自己分配的内存原创 2022-01-26 17:57:44 · 126 阅读 · 0 评论 -
valgrind检测内存泄漏
1 valgrind 安装1.1 valgrind安装包获取http://www.valgrind.org/downloads/valgrind-3.14.0.tar.bz21.2 安装tar -jxvf valgrind-3.14.0.tar.bz2cd valgrind-3.14.0./configure --prefix=/home/user1/valgrindmakemake install如果安装的时候采用默认的安装路径,执行configure是可以不加配置–prefix参数具原创 2021-07-07 17:39:17 · 797 阅读 · 0 评论 -
linxu磁盘分区与挂载
1、磁盘分区分区介绍分区是将一个硬盘驱动器分成若干个逻辑驱动器,把硬盘连续的区块当做一个独立的磁硬使用,磁盘分区可以防止数据丢失:如果系统只有一个分区,那么这个分区损坏,用户将会丢失所的有数据。增加磁盘空间使用效率:可以用不同的区块大小来格式化分区,如果有很多1K的文件,而硬盘分区区块大小为4K,那么每存储一个文件将会浪费3K空间。这时我们需要取这些文件大小的平均值进行区块大小的划分。数据激增到极限不会引起系统挂起:将用户数据和系统数据分开,可以避免用户数据填满整个硬盘,引起的系挂起分区工具fd原创 2021-02-26 19:31:40 · 189 阅读 · 0 评论 -
boost库scoped_array智能指针实现
1 scoped_array智能指针特点与scoped_ptr不同的是scoped_array智能指针管理new出来的数组空间,同样的是智能指针所管理的空间不能转移,但是可以通过成员方法reset让它去管理新的内存空间。在使用时要注意以下几点1、构造函数接受的指针p必须是new[]的结果,而不能是new表达式的结构2、没有*、->操作符重载(但是可以扩展)3、析构函数使用delete[]释放资源,而不是delete4、提供operator[]操作符重载,可以向普通数组一样用下标访问元素2原创 2020-12-26 18:19:15 · 194 阅读 · 2 评论 -
boost版scoped_ptr智能指针实现
1 scoped_ptr智能指针特点与auto_ptr智能指针不同的是,scoped_ptr智能指针所管理的空间不能转移,即不能通过拷贝或赋值将原先管理的空间交由新的智能指针管理,因此在实现时要将拷贝构造和赋值声明为私有。另外,scoped_ptr智能指针所管理的空间虽然不能转移,但是可以通过成员方法reset让它去管理新的内存空间,这时要注意原来所管理空间的释放,因为不能转移出去其他的智能指针管理,所以reset的实现一定要保证原来空间的释放。2 scoped_ptr智能指针实现#define _C原创 2020-12-26 17:31:07 · 114 阅读 · 0 评论 -
vs版本auto_ptr智能指针实现
1 vs版本auto_ptr智能指针实现vs版本auto_ptr智能指针解决了vc版的缺点,即智能指针通过拷贝或赋值转让空间后,不能再通过原来的智能指针去访问失去管理权的空间,在空间管理权所属方面与vc版不同的是,vs版的实现是通过使成员指针__Ptr为空表示失去空间管理权,而vc版的实现是通过成员_Owns为假时表示失去空间管理权。#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>#inc原创 2020-12-26 15:30:00 · 323 阅读 · 0 评论 -
vc版auto_ptr智能指针实现
1 vc版auto_ptr智能指针实现#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>//#include<memory>#include <vld.h>using namespace std;template<class _Ty>class AutoPtr{public: // 默认构造函数,_Ptr为空时,没有任何空间的管理权 Aut原创 2020-12-26 00:01:41 · 122 阅读 · 0 评论 -
c++ 写实拷贝实现demo
#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>#include <vld.h> // 内存泄漏检测using namespace std;class String;ostream& operator<<(ostream &out, const String &s);// 引用计数类,通过深拷贝来构造// 同时提供Increase原创 2020-12-22 22:27:15 · 148 阅读 · 0 评论 -
c++ const对象与const函数
本文主要讨论c++中***const修饰的常对象与没有const修饰的普通对象中的成员函数返回值的常性问题***,其中成员函数包括有const修饰和没有const修饰(因为const在成员函数中能形成重载所以能并存),成员变量包括普通变量,指针变量与对象1 类中的成员变量为普通变量#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>using namespace std;class Bas原创 2020-12-20 21:44:19 · 284 阅读 · 0 评论 -
c++ new与delete
1 new与delete的使用在C++中,申请和释放堆中分配的存贮空间,分别使用new和delete的两个运算符来完成,其使用的格式如下:对于单个对象:指针变量名=new 类型名(初始化式)int *p = new int(10);delete p;对于数组进行动态分配的格式:指针变量名=new 类型名[下标表达式];int *p = new int[10]delete [] p;注意点:1、对于多维数组的的delete也只需加一个[],[]中无需填写数组的大小2、由new创建对象原创 2020-12-15 22:39:43 · 153 阅读 · 0 评论 -
c++类的静态成员
静态成员由关键字static修饰说明的类成员,成为静态类成员(static class member)。虽然使用static修饰说明,但与函数中的静态变量有明显差异。类的静态成员为其所有对象共享,不管有多少对象,静态成员只有一份存于公用内存中。类的静态成员分为静态成员变量和静态成员函数。1 静态成员变量在类定义中,用关键字static修饰的数据成员为静态数据成员。该类产生的所有对象共享系统为静态成员分配的一个存储空间,而这个存储空间是在编译时分配的,在定义对象时不再为静态成员分配空间,即静态成员的大原创 2020-12-13 19:08:26 · 906 阅读 · 0 评论 -
结构体对齐与大小
结构体的成员不同的存放顺序,结构体的大小会有不同,这与结构体的对齐单位与结构体成员的偏移量有关结构体对齐单位结构体的对齐单位由下面3个数值的大小决定,且取其中的最小值,结构体的最终大小一定是对齐单位的正数倍1、系统架构设置的默认单位:windows系统8字节对齐、32位linux系统 4字节对齐、64位linux系统4字节对齐2、结构体成员最大类型3、程序设定 #pragma pack(x)结构体的偏移量结构体的偏移量是结构体成员存放时成员的地址相对于结构体的起始地址偏移,偏移量的求值规则:原创 2020-11-12 00:06:28 · 579 阅读 · 0 评论 -
位运算
基本概念整数在计算机中用二进制的位来表示,C语言提供一些运算符可以直接操作整数中的位,称为位运算。位运算是指按二进制位进行的运算,C语言不直接支持位运算,必须借助于位运算符完成。运算对象只能为整型或字符型数据按位与 &// 按位与 两个数都为1 结果是11011 1000 = 0xb8& 0101 0111 = 0x570001 0000 = 0x10;作用:位(1或0)和 1按位与得本身按位或 |两个数中有一个为1则为11011 1000 = 0xb8| 0原创 2020-11-10 22:01:53 · 123 阅读 · 0 评论 -
变量的作用域和生命周期
1、内存布局1、栈区:存放函数的参数,局部变量等2、堆区:动态内存分配(malloc)3、静态全局区:静态全局区又划分为未初始化数据区(bss)、初始化数据区(data)、文字常量区(字符串常量、const修饰的静态变量和全局变量)4、代码区(text):可执行文件的二进制代码(函数)编译程序时,编译器就已经给 代码区 BSS区 data区规划了内存,但是这个时候没有分配空间,当程序运行时程序执行main’函数前先给代码区 BSS区 data区分配指定大小的空间,在执行main’函数时,运行到原创 2020-11-08 00:12:50 · 370 阅读 · 0 评论 -
源码,反码,补码
一、基本前提:1、C语言中数据分为有符号数和无符号数,有符号数可以表示正数和负数,无符号数只能表示正数,其中有符号数的最高位为符号位,1表示负数,0表示正数,剩余的位表示数据位;无符号数的所有位都表示数据位。2、数据在内存中都是以二进制存储,且都是以二进制补码的形式存储。二、源码、反码、补码1、源码:一个数最原始的二进制数正数源码: 120 0111 1000负数源码: -23 1001 01110的源码: 0 0000 0000-0的源码: -0 1000 00001的源码: 1原创 2020-10-31 18:04:47 · 4740 阅读 · 1 评论