C++不定长字符串比较合理且简单的解决方法
这是写飞秋时用到的代码,上次发的版本有点问题,不够完善,这次经过测试并且修改,基本上感觉可以投入使用了,如果你不想自己写,那可以用我的代码。
我的代码不能说100%完美,但最少,没有内存泄漏的地方。另外,如果有什么不足,欢迎留言给我哦!感激不尽。
// testrealloc.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define XString_LENGTH 1024 // 默认缓存区的长度
class XString
{
char *m_x;
unsigned int m_size;
public:
XString();
~XString();
unsigned int GetSize();
unsigned int GetData(char *&pData);
bool AddData(char *pData, unsigned int nLen);
};
XString::XString()
{
m_size = 0;
m_x = (char*)malloc(XString_LENGTH);
}
XString::~XString()
{
if (m_x)
{
free(m_x);
m_x = NULL;
}
}
unsigned int XString::GetSize()
{
return m_size;
}
unsigned int XString::GetData(char * &pData)
{
pData = (char*)malloc(m_size+1);
if (!pData)
return 0;
memcpy(pData, m_x, m_size);
pData[m_size] = NULL;
return m_size+1;
}
bool XString::AddData(char *pData, unsigned int nLen)
{
if (nLen <= 0)
return false;
if (! pData)
return false;
unsigned nOldSize = m_size;
m_size += nLen;
if (m_size > XString_LENGTH)
{
// int n = m_size - XString_LENGTH;
char *p = m_x;
m_x = (char*)realloc(m_x, m_size);
if (!m_x)
{
m_x = p;
return false;
}
memcpy(m_x+nOldSize, pData, nLen);
// m_x[m_size]=NULL;
// printf("%s-%d\n", m_x, m_size);
// getchar();
}
else
{
memcpy(m_x+nOldSize, pData, nLen);
}
return true;
}
void k() // 此代码用于飞秋 http://bbs.freeeim.com/
{
XString a;
for (int i=0; i<3000; i++)
{
if (! a.AddData("88888888", 8))
{
printf("add data failed.\n");
}
}
getchar();
}
int main(int argc, char* argv[])
{
for(int i=0; i<100; i++)
{
k();
}
getchar();
return 0;
}
C++不定长字符串比较合理且简单的解决方法相关推荐
- 奔五的人学ios:swift竟然没有字符串包括,找个简单的解决方法
swift关于字符串的推断中 有前导.有后缀 两个方法.竟然没有包括推断. 经过学习找了个简单的解决方法: extension String {func has(v:String)->Bool ...
- mysql json 引号 双引号_关于JSON字符串key缺少双引号的解决方法 的讲解
JSON字符串key缺少引号的解决方法 JSON字符串是key:value形式的字符串,正常key是由双引号括起来的. 例如:<?php $data = array('name'=>'fd ...
- 一个简单的解决方法:word文档打不开,错误提示mso.dll模块错误。
一个简单的解决方法:word文档打不开,错误提示mso.dll模块错误. 参考文章: (1)一个简单的解决方法:word文档打不开,错误提示mso.dll模块错误. (2)https://www.cn ...
- Eclipse中Errors occurred during the build最简单的解决方法
Eclipse中Errors occurred during the build最简单的解决方法 参考文章: (1)Eclipse中Errors occurred during the build最简 ...
- Windows网络共享或共享打印机无法访问连接的简单终极解决方法
相信上面这张报错图很多人都遇到过吧. 微软的网络访问真的设计的很奇葩,明明你共享权限.防火墙.用户都已经设置好了,但当你用资源管理器输入\\双斜杠IP地址或计算机名后就弹出上面的报错窗口. 其实有个非 ...
- 电脑经常蓝屏要怎么解决?有什么简单的解决方法么?
电脑经常蓝屏要怎么解决?有什么简单的解决方法么?其实关于电脑经常蓝屏,你需要分析到底是哪些方面造成的,到底是硬件问题还是软件问题,只有知道是哪方面出问题了,你才能快速彻底的解决,今天小编就来给大家详细 ...
- 将字符串转换为 uniqueidentifier 时失败的解决方法
将字符串转换为 uniqueidentifier 时失败的解决方法 参考文章: (1)将字符串转换为 uniqueidentifier 时失败的解决方法 (2)https://www.cnblogs. ...
- c语言输入任意长度字符串,读取不定长字符串输入
C语言通常使用scanf处理输入,如果要读取字符串,那么就需要定义一个字符数组(char[]).可是,如果数组定义长度不足,就可能发生溢出. 在C语言里有个可以用来读取字符的函数(getchar),我 ...
- win服务器物理内存占用高,win10系统长时间使用物理内存过高的解决方法
很多小伙伴都遇到过win10系统长时间使用物理内存过高的困惑吧,一些朋友看过网上零散的win10系统长时间使用物理内存过高的处理方法,并没有完完全全明白win10系统长时间使用物理内存过高是如何解决的 ...
最新文章
- 关于实验中的makefile相关知识
- Altium Designer -- PCB 叠层设计
- web安全学习—Http协议基础
- 软件技术专业-就业提示(三、Java工程师必备技能)
- go 怎么等待所有的协程完成_理解真实世界中 Go 的并发 BUG
- mysql @符号_MySQL 数值类型
- 背景色透明,里面内容(图片、文字)不透明
- 【netty】netty HashedWheelTimer 延时队列
- php语言开始和结束分别为,0055 PHP语言简介和HelloWorld
- RHEL6 Tiny Linux 的制作
- Linux cc 和 gcc 的区别概括介绍
- 前端常见跨域解决方案
- 论文笔记_S2D.44_自监督的从稀疏到稠密:用激光雷达和单目摄像机进行自监督深度补全
- 《手把手教你学DSP——基于TMS320F28335》北京航空航天大学出版社-张卿杰等-电子版-PDF
- 大数据应用能力层次模型
- 机甲Android on ios,全球首款iOS+Android双系统硬件机甲震撼上市
- Qt实现word文档转html
- 【LeetCode】1427、字符串的左右移
- 华为机试真题 Java 实现【不含 101 的数】【2022.11 Q4新题】
- r5处理器_Intel难受了,R54500U,6核心处理器笔记本价格才3499元