陕西网站建设哪家好/seo是什么技术
【C++】郭老二博文之:C++目录
1、Poco::AutoPtr 智能指针
1.1 说明
Poco::AutoPtr是一个含有引用计数的“智能”指针模版。
Poco::AutoPtr用于支持引用计数的类实例化。支持引用计数的类需要有以下要求:
- 维护一个引用计数(在创建时初始化为1)
- 实现void duplicate()方法,增加引用计数
- 实现void release()方法,减少引用计数,当它达到零时,删除对象
Poco::AutoPtr支持完整的值语义(默认构造函数、复制构造函数、赋值),可以在集合中使用
(例如std::vector或std::map)。
使用Poco::AutoPtr::isNull()或Poco::AutoPtr::operator !()来测试是否为空
AutoPtr强制转换总是类型安全的(内部使用了dynamic_cast,因此无效的强制转换将导致空指针)。
AutoPtr::AutoPtr(C* pObject, bool shared); // shared=true,表示为共享指针
1.2 用法
下面的示例中 RCO 维护一个引用计数_rc,在创建时,将_rc赋值为1,然后实现两个方法duplicate和release,示例源码如下:
#include "Poco/AutoPtr.h"
using Poco::AutoPtr;
class RCO
{
public:RCO(): _rc(1){}void duplicate(){++_rc; // Warning: not thread safe!}void release(){if (--_rc == 0) delete this; // Warning: not thread safe!}
private:int _rc;
};int main(int argc, char** argv)
{RCO* pNew = new RCO; // _rc == 1AutoPtr<RCO> p1(pNew); // _rc == 1AutoPtr<RCO> p2(p1); // _rc == 2AutoPtr<RCO> p3(pNew, true); // _rc == 3p2 = 0; // _rc == 2p3 = 0; // _rc == 1RCO* pRCO = p1; // _rc == 1p1 = 0; // _rc == 0 -> deleted// pRCO and pNew now invalid!p1 = new RCO; // _rc == 1return 0;
} // _rc == 0 -> deleted
2、Poco::RefCountedObject 引用计数对象
2.1 说明
Poco::RefCountedObject 实现线程安全的引用计数语义。从poco-1.3.4版本开始,它使用特定于平台的原子操作。
Poco::RefCountedObject可以用作实现引用计数的类的基类。
Poco::RefCountedObject有一个受保护的析构函数,禁止复制构造和赋值。
所有引用计数的对象都应该有一个受保护的析构函数,以禁止显式使用delete。
2.2 用法
#include "Poco/RefCountedObject.h"
#include "Poco/AutoPtr.h"
#include <iostream>
using Poco::RefCountedObject;
using Poco::AutoPtr;
class RCO: public RefCountedObject
{
public:RCO(){}void greet() const{std::cout << "Hello, world!" << std::endl;}
protected:~RCO(){}
};int main(int argc, char** argv)
{AutoPtr<RCO> pRCO(new RCO);pRCO->greet(); // AutoPtr has -> operator(*pRCO).greet(); // AutoPtr has * operatorstd::cout << "refcount: " << pRCO->referenceCount() << std::endl;RCO* p1 = pRCO; // AutoPtr supports conversion to plain pointerRCO* p2 = pRCO.get();return 0;
}
3、Poco::AutoReleasePool 自动释放池
3.1 说明
Poco::AutoReleasePool获取添加到它的每个对象的所有权
当Poco::AutoReleasePool被销毁(或者它的release()方法被调用)时,它通过调用每个对象的release()方法释放对它持有的所有对象的引用。
3.2 用法
#include "Poco/AutoReleasePool.h"
using Poco::AutoReleasePool;
class C
{
public:C(){}void release() {delete this;}
};int main(int argc, char** argv)
{AutoReleasePool<C> pool;C* pC = new C;pool.add(pC);pC = new C;pool.add(pC);return 0;
}
// 两次new的C,都将被销毁
4、Poco::SharedPtr 共享指针
4.1 说明
Poco::AutoPtr用于类自身含有引用计数的对象;
Poco::SharedPtr为普通类实现引用计数(自身不需要实现引用计数的类)
头文件:#include “Poco/SharedPtr.h”
警告:将同一个普通指针分配给不同的Poco::SharedPtr将导致该对象有多个所有者,从而导致未定义的行为(换句话说,崩溃)。
一旦对一个对象使用了Poco::SharedPtr,就不要再使用指向那个对象的普通指针了
Poco::SharedPtr支持完整的值语义(默认构造函数、复制构造函数、赋值),并可用于集合(例如std::vector或std::map)。
使用SharedPtr::isNull()或SharedPtr::operator !()来测试是否为空
4.2 用法
#include "Poco/SharedPtr.h"
#include <string>
#include <iostream>
using Poco::SharedPtr;
int main(int argc, char** argv)
{std::string* pString = new std::string("hello, world!");Poco::SharedPtr<std::string> p1(pString); // rc == 1Poco::SharedPtr<std::string> p2(p1); // rc == 2p2 = 0; // rc == 1// p2 = pString; // 崩溃: 多个所有者p2 = p1; // rc == 2std::string::size_type len = p1->length(); // 使用“->”解引用std::cout << *p1 << std::endl; // 使用“*”解引用 return 0;
}
4.3 自定义释放策略
Poco::SharedPtr的默认实现将简单地调用delete pObj
用new[]创建的对象,默认使用delete 肯定会出错,因为释放时,需要调用delete[] pObj
可以在创建Poco::SharedPtr时,使用自定义释放策略
模版如下:
Poco::SharedPtr<T, ReferenceCounter, ArrayReleasePolicy>
使用示例
template <class C>
class ArrayReleasePolicy
{
public:static void release(C* pObj) {delete [] pObj;}
};char* pStr = new char[100];
Poco::SharedPtr<char, Poco::ReferenceCounter, ArrayReleasePolicy> p(pStr);
5、Poco::DynamicFactory 动态工厂类模板
5.1 说明
Poco::DynamicFactory支持按“name”名称创建对象。
头文件:#include “Poco/DynamicFactory.h”
Poco::DynamicFactory管理的所有类必须有一个共同的基类。
Poco::DynamicFactory为基类实例化。
C* Poco::DynamicFactory::createInstance(const std::string& name) const;创建具有给定名称的子类的实例。
要做到这一点,类和它们的实例化器(工厂类)必须在Poco::DynamicFactory中注册
5.2 用法
#include "Poco/DynamicFactory.h"
#include "Poco/SharedPtr.h"
using Poco::DynamicFactory;
using Poco::SharedPtr;class Base {};
class A: public Base{};
class B: public Base{};int main(int argc, char** argv)
{DynamicFactory<Base> factory;# a)注册factory.registerClass<A>("A");factory.registerClass<B>("B");# b)使用工厂来创建SharedPtr<Base> pA = factory.createInstance("A");SharedPtr<Base> pB = factory.createInstance("B");# c)取消注册factory.unregisterClass("B");# d)检查是否存在bool haveA = factory.isClass("A"); // truebool haveB = factory.isClass("B"); // false (已取消注册)bool haveC = factory.isClass("C"); // false (没有注册过)return 0;
}
6、Poco::Instantiator 实例化辅助类
6.1 说明
使用Poco::DynamicFactory工厂方法来创建类,类必须有默认构造函数,如果没有,需要Poco::Instantiator来辅助实现。
6.2 用法
#include "Poco/DynamicFactory.h"
using Poco::DynamicFactory;
using Poco::AbstractInstantiator;
class Base {};
class A: public Base {};
class C: public Base
{
public:C(int i): _i(i){}
private:int _i;
};class CInstantiator: public AbstractInstantiator<Base>
{
public:CInstantiator(int i): _i(i){}Base* createInstance() const { return new C(_i);}
private:int _i;
}int main(int argc, char** argv)
{DynamicFactory<Base> factory;factory.registerClass<A>("A");factory.registerClass("C", new CInstantiator(42));return 0;
}
7、Poco::Buffer 缓冲区管理
7.1 说明
当与遗留的C库或操作系统调用接口时,通常需要提供一定大小的缓冲区。
如果缓冲区大于几个字节,则必须在堆上分配。
这需要某种类型的内存管理,以确保缓冲区在不再使用时被删除,即使在异常的情况下。
std::auto_ptr或Poco::SharedPtr(具有默认的发布策略)不能在这里使用,因为它们不适用于数组。
Poco::Buffer可用于提供固定大小的缓冲区(数组),该缓冲区在堆上分配,并在Buffer对象超出作用域时自动删除。
7.2 用法
头文件:#include “Poco/Buffer.h”
- begin()方法返回一个指向缓冲区开头的指针。
- end()方法返回一个指向缓冲区末尾的指针。
- 索引操作符提供对缓冲区中单个元素的访问。
#include <Poco/Buffer.h>
#include <string>
#include <iostream>
using Poco::Buffer;
int main(int argc, char** argv)
{Buffer<char> buffer(1024);std::cin.read(buffer.begin(), buffer.size());std::streamsize n = std::cin.gcount();std::string s(buffer.begin(), n);std::cout << s << std::endl;return 0;
}
8、Poco::MemoryPool 内存池
8.1 说明
许多应用程序需要非常频繁地分配和释放给定大小的缓冲区。
在堆上分配缓冲区会影响性能,并可能导致堆碎片。
因此,一旦缓冲区被分配,重用它是有意义的。
Poco::MemoryPool 是一个内存池,一次分配,多次使用,维护一定大小的内存块集合
8.2 用法
- void* MemoryPool::get():从内存池中获取一个指向连续内存块的指针。如果没有可用的块,则分配一个新的块。可以限制块的最大数量。如果没有更多的块可用,则抛出OutOfMemoryException。
- void MemoryPool::release(void* ptr):将内存块释放回内存池。
#include "Poco/MemoryPool.h"
#include <string>
#include <iostream>
using Poco::MemoryPool;
int main(int argc, char** argv)
{MemoryPool pool(1024); // unlimited number of 1024 byte blocks// MemoryPool pool(1024, 4, 16); // at most 16 blocks; 4 preallocatedchar* buffer = reinterpret_cast<char*>(pool.get());std::cin.read(buffer, pool.blockSize());std::streamsize n = std::cin.gcount();std::string s(buffer, n);pool.release(buffer);std::cout << s << std::endl;return 0;
}
9、POCO::SingletonHolder 线程安全的单例
9.1 说明
POCO提供了一个POCO::SingletonHolder类,帮助对延迟创建的单例进行线程安全管理。
头文件:#include “Poco/SingletonHolder.h”
单例实例在第一次被请求时创建在堆上。
当应用程序终止时,单例实例被销毁。
9.2 用法
#include "Poco/SingletonHolder.h"
class MySingleton
{
public:MySingleton(){// ...}~MySingleton(){// ...}// ...static MySingleton& instance(){static Poco::SingletonHolder<MySingleton> sh;return *sh.get();}
}
相关文章:

【C++】POCO学习总结(十四):引用计数、共享指针、缓冲区管理
【C】郭老二博文之:C目录 1、Poco::AutoPtr 智能指针 1.1 说明 Poco::AutoPtr是一个含有引用计数的“智能”指针模版。 Poco::AutoPtr用于支持引用计数的类实例化。支持引用计数的类需要有以下要求: 维护一个引用计数(在创建时初始化为1)实现void du…...

Python之禅
import this 这是 Python 社区中著名的 "The Zen of Python"(Python之禅)文档,由 Python 创始人之一的 Tim Peters 撰写。这个文档包含了一系列关于编程和代码设计哲学的原则,以指导 Python 社区的开发者。以下是这些原…...

RocketMQ源码 Broker-SubscriptionGroupManager 订阅组管理组件源码分析
前言 SubscriptionGroupManager 继承了ConfigManager配置管理组件,拥有将内存数据持久化到磁盘文件subscriptionGroup.json的能力。它主要负责维护所有消费组在内存中的订阅数据。 源码版本:4.9.3 源码架构图 核心数据结构 主要的数据结构比较简单&am…...

go-zero开发入门-API网关鉴权开发示例
本文是go-zero开发入门-API网关开发示例一文的延伸,继续之前请先阅读此文。 在项目根目录下创建子目录 middleware,在此目录下创建文件 auth.go,内容如下: // 鉴权中间件 package middlewareimport ("context""e…...

[LLM]nanoGPT---训练一个写唐诗的GPT
karpathy/nanoGPT: The simplest, fastest repository for training/finetuning medium-sized GPTs. (github.com) 原有模型使用的莎士比亚的戏剧数据集, 如果需要一个写唐诗机器人,需要使用唐诗的文本数据, 一个不错的唐诗,宋词数据的下载…...

docker compose部署wordpress
准备机器: 192.168.58.151 (关闭防火墙和selinux) 安装好docker服务 (详细参照:http://t.csdnimg.cn/usG0s 中的国内源安装docker) 部署wordpress: 创建目录: [rootdocker ~]# mkdir…...

【docker四】使用Docker-compose一键部署Wordpress平台
目录 一、YAML 文件格式及编写注意事项(重要) 1、yaml文件使用时注意事项: 2、yaml文件的基本数据结构: 2.1、声明变量(标量。是单个的不可再分的值,类型:字符串,整数,…...

HTML程序大全(1):简易计算器
HTML代码,主要创建了几个按钮。 <div class"container"><div class"output" id"output">0</div><button class"button" onclick"clearOutput()" id"clear">C</button>…...

esp32服务器与android客户端的tcp通讯
esp32 //esp32作为服务端 #include <WiFi.h>#define LED_BUILTIN 2 // 创建热点 const char *ssid "ESP32"; const char *password "12345678"; const int port 1122; //端口 WiFiServer server(port); void setup() {delay(5000);pinMode(LED_…...

自定义Mybatis LanguageDriver性能优化
场景:高并发情况下mybatis 动态sql 解析 锁问题优化 优化前 并发测试 XMLLanguageDriver 类 的 createSqlSource 方法有锁 而且 每次执行时都会走该方法 优化前 : 线程有Block 优化后的 LanguageDriver public class CustomXMLLanguageDriver im…...

DevEco Studio 鸿蒙(HarmonyOS)项目结构
DevEco Studio 鸿蒙(HarmonyOS)项目结构 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、项目结构 创建简单的Hello World移动应用项目结构如下图 由上到下说明各个文件夹的作用 .hvigor:存…...

Springboot整合篇Druid
一、概述 1.1简介 Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控。 它本身还自带一个监控平台,可以查看时时产生的sql、uri等监控数据,可以排查慢sql、慢请求࿰…...

uniapp 微信小程序 封装axios 包含请求拦截、响应拦截、无感刷新令牌功能
前言: 1、为什么不适用uniapp自带的请求功能? 答:uniapp自带的请求功能,再刷新了令牌后,重新请求返回的数据无法返回给发起请求的方法。也就是说,刷新令牌后重新发起的请求和第一次发起请求的方法是割裂的。…...

C语言精选——选择题Day41
第一题 1. 有以下程序段: char *p, *q; p (char *)malloc(sizeof(char) * 20); q p; scanf("%s %s", p, q); printf("%s %s\n", p, q); 若从键盘输入:abc def↙,则输出结果是( ) A:d…...

Tomcat头上有个叉叉
问题原因: 这是因为它就是个空的tomcat,并没有导入项目运行 解决方案: war模式:发布模式,正式发布时用,将WEB工程以war包的形式上传到服务器 war exploded模式:开发时用,将WEB工程的文件夹直接…...

Linux shell编程学习笔记35:seq
0 前言 在使用 for 循环语句时,我们经常使用到序列。比如: for i in 1 2 3 4 5 6 7 8 9 10; do echo "$i * 2 $(expr $i \* 2)"; done 其中的 1 2 3 4 5 6 7 8 9 10;就是一个整数序列 。 为了方便我们使用数字序列,Linux提供了…...

Nougat:结合光学神经网络,引领学术PDF文档的智能解析、挖掘学术论文PDF的价值
Nougat:结合光学神经网络,引领学术PDF文档的智能解析、挖掘学术论文PDF的价值 这是Nougat的官方存储库,Nougat是一种学术文档PDF解析器,可以理解LaTeX数学和表格。 Project page: https://facebookresearch.github.io/nougat/ …...

涉密网络的IP查询防护策略
涉密网络的安全性对于维护国家、企业及个人的核心利益至关重要。在当今数字化时代,网络攻击日益猖獗,其中IP查询是攻击者获取目标信息的一种常见手段。本文将探讨涉密网络中防护IP查询的关键策略,以确保网络的机密性和安全性。 1. 专用VPN和…...

基础算法(1):排序(1):选择排序
今天对算法产生了兴趣,开始学习基础算法,比如排序,模拟,贪心,递推等内容,算法是很重要的,它是解决某个问题的特定方法,程序数据结构算法,所以对算法的学习是至关重要的&a…...

GeoTrust OV证书
当谈到网站安全性和可信度时,GeoTrust OV证书是一个备受推崇的选择。作为一家备受尊敬的数字证书颁发机构,GeoTrust以其卓越的品牌声誉和高质量的产品而闻名于世。GeoTrust OV证书提供了一系列的安全功能,同时还具有出色的性价比,…...

第一个“hello Android”程序
1、首先安装Android studio(跳过) Android Studio是由Google推出的官方集成开发环境(IDE),专门用于Android应用程序的开发。它是基于JetBrains的IntelliJ IDEA IDE构建的,提供了丰富的功能和工具࿰…...

docker-compose安装nacos和msql
docker-compose安装nacos和msql 前言前提已经安装docker-compose,如果没有安装,则可以查看上面系列文章中的安装教程。并且文章中使用的是mobaxterm连接虚拟机。 1、下载2、创建并运行 前言 前提已经安装docker-compose,如果没有安装&#x…...

AnythingLLM:基于RAG方案构专属私有知识库(开源|高效|可定制)
一、前言 继OpenAI和Google的产品发布会之后,大模型的能力进化速度之快令人惊叹,然而,对于很多个人和企业而言,为了数据安全不得不考虑私有化部署方案,从GPT-4发布以来,国内外的大模型就拉开了很明显的差距…...

常见的工作流编排引擎
常见工作流框架:微服务编排引擎 工作流框架还是比较多的,按照语言分类的话,有 Java: jBPM、Activiti、SWF PHP: Tpflow、PHPworkflow Go: Cadence(Cadence由Uber开发并开源,Maxim Fateev是Cadence的主架构师&#…...

期末总复习(重点!!!)
一、第6章异常处理 1、什么是异常、什么是异常处理异常是指程序在运行过程中发生的错误事件,影响程序的正常执行。异常并不是一定会发生,默认情况下,程序运行中遇到异常时将会终止,并在控制台打印出异常出现的堆栈信息。异常处理…...

input 获取焦点后样式的修改
一、实现目标 1.没有获取焦点时样子 2.获取焦点时 代码: <input class"input"placeholder"请输入关键字" input"loadNode" />css .input {border-radius: 14px;border:1px solid #e4e4e4;margin: 5px;margin-top: 10px;wi…...

持续集成交付CICD:Jenkins使用GitLab共享库实现自动上传前后端项目Nexus制品
目录 一、实验 1.GitLab本地导入前后端项目 2.Jenkins新建前后端项目流水线 3.Sonarqube录入质量阈与质量配置 4.修改GitLab共享库代码 5.Jenkins手动构建前后端项目流水线 6.Nexus查看制品上传情况 7.优化代码获取RELEASE分支 8.优化Jenkins流水线项目名称 一、实验 …...

50mA、24V、超低 IQ、低压降稳压器
一、Description The TPS715 low-dropout (LDO) voltage regulators offer the benefits of high input voltage, low-dropout voltage, low-power operation, and miniaturized packaging. The devices, which operate over an input range of 2.5 V to 24 V, are stable wit…...

【Python测试开发】文件上传操作
先写一个上传页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>文件上传</title><link href"http://dcn.bootcss/bootstrap/3.3.0/css/bootstrap.min.css" rel"styleshee…...

深兰科技AI医疗健康产品获3000台采购订单
12月6日,武汉某企业与深兰科技签署协议,一次性采购3,000台深兰科技AI生理健康检测仪——扁鹊。 深兰科技AI生理健康检测仪——扁鹊是深兰科技推出的人体生理指标检测产品。基于AI生物技术、融合互联网医疗及AIoT技术,深兰科技AI生理健康检测仪…...