这是写飞秋时用到的代码,上次发的版本有点问题,不够完善,这次经过测试并且修改,基本上感觉可以投入使用了,如果你不想自己写,那可以用我的代码。

我的代码不能说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++不定长字符串比较合理且简单的解决方法相关推荐

  1. 奔五的人学ios:swift竟然没有字符串包括,找个简单的解决方法

    swift关于字符串的推断中 有前导.有后缀 两个方法.竟然没有包括推断. 经过学习找了个简单的解决方法: extension String {func has(v:String)->Bool ...

  2. mysql json 引号 双引号_关于JSON字符串key缺少双引号的解决方法 的讲解

    JSON字符串key缺少引号的解决方法 JSON字符串是key:value形式的字符串,正常key是由双引号括起来的. 例如:<?php $data = array('name'=>'fd ...

  3. 一个简单的解决方法:word文档打不开,错误提示mso.dll模块错误。

    一个简单的解决方法:word文档打不开,错误提示mso.dll模块错误. 参考文章: (1)一个简单的解决方法:word文档打不开,错误提示mso.dll模块错误. (2)https://www.cn ...

  4. Eclipse中Errors occurred during the build最简单的解决方法

    Eclipse中Errors occurred during the build最简单的解决方法 参考文章: (1)Eclipse中Errors occurred during the build最简 ...

  5. Windows网络共享或共享打印机无法访问连接的简单终极解决方法

    相信上面这张报错图很多人都遇到过吧. 微软的网络访问真的设计的很奇葩,明明你共享权限.防火墙.用户都已经设置好了,但当你用资源管理器输入\\双斜杠IP地址或计算机名后就弹出上面的报错窗口. 其实有个非 ...

  6. 电脑经常蓝屏要怎么解决?有什么简单的解决方法么?

    电脑经常蓝屏要怎么解决?有什么简单的解决方法么?其实关于电脑经常蓝屏,你需要分析到底是哪些方面造成的,到底是硬件问题还是软件问题,只有知道是哪方面出问题了,你才能快速彻底的解决,今天小编就来给大家详细 ...

  7. 将字符串转换为 uniqueidentifier 时失败的解决方法

    将字符串转换为 uniqueidentifier 时失败的解决方法 参考文章: (1)将字符串转换为 uniqueidentifier 时失败的解决方法 (2)https://www.cnblogs. ...

  8. c语言输入任意长度字符串,读取不定长字符串输入

    C语言通常使用scanf处理输入,如果要读取字符串,那么就需要定义一个字符数组(char[]).可是,如果数组定义长度不足,就可能发生溢出. 在C语言里有个可以用来读取字符的函数(getchar),我 ...

  9. win服务器物理内存占用高,win10系统长时间使用物理内存过高的解决方法

    很多小伙伴都遇到过win10系统长时间使用物理内存过高的困惑吧,一些朋友看过网上零散的win10系统长时间使用物理内存过高的处理方法,并没有完完全全明白win10系统长时间使用物理内存过高是如何解决的 ...

最新文章

  1. 关于实验中的makefile相关知识
  2. Altium Designer -- PCB 叠层设计
  3. web安全学习—Http协议基础
  4. 软件技术专业-就业提示(三、Java工程师必备技能)
  5. go 怎么等待所有的协程完成_理解真实世界中 Go 的并发 BUG
  6. mysql @符号_MySQL 数值类型
  7. 背景色透明,里面内容(图片、文字)不透明
  8. 【netty】netty HashedWheelTimer 延时队列
  9. php语言开始和结束分别为,0055 PHP语言简介和HelloWorld
  10. RHEL6 Tiny Linux 的制作
  11. Linux cc 和 gcc 的区别概括介绍
  12. 前端常见跨域解决方案
  13. 论文笔记_S2D.44_自监督的从稀疏到稠密:用激光雷达和单目摄像机进行自监督深度补全
  14. 《手把手教你学DSP——基于TMS320F28335》北京航空航天大学出版社-张卿杰等-电子版-PDF
  15. 大数据应用能力层次模型
  16. 机甲Android on ios,全球首款iOS+Android双系统硬件机甲震撼上市
  17. Qt实现word文档转html
  18. 【LeetCode】1427、字符串的左右移
  19. 华为机试真题 Java 实现【不含 101 的数】【2022.11 Q4新题】
  20. r5处理器_Intel难受了,R54500U,6核心处理器笔记本价格才3499元

热门文章

  1. 最优化学习笔记(二十)——全局搜索算法
  2. 最优化学习笔记(十三)——基本共轭方向算法(扩张子空间定理)
  3. 2021住房消费品质服务报告
  4. 手把手教你做用户画像
  5. 移动数字广告与互联网反欺诈蓝皮报告
  6. 作者:石勇(1956-),男,中国科学院大学经济管理学院教授、博士生导师
  7. 【2016年第2期】专题导读:大数据与社会治理
  8. 【Python】PyCharm新建PythonPackage呈现出普通Dictionary的样式的解决方法
  9. centos 7 通过yum安装dnf 包管理器
  10. Python3 标准库及相关内容