1、memory拷贝,根据拷贝的字节个数,从src一个一个字节拷贝到dst,拷贝过程不管src的取值,也不管dst是否能容纳。
2、因此,对于memory拷贝,src中NULL字符(取值为0的字符)后面的字符也能拷贝过去。不管dst是否能容纳,都拷贝过去,会存在踩内存。为了避免踩内存,拷贝的字节个数,需要小于等于dst分配的大小。
3、string拷贝,遇到src的NULL字符结束。因此,strcpy有两个问题特别需要注意:一,src结尾必须要有NULL字符,否则会一直拷贝下去,直到遇到NULL字符。二,dst在src有效长度的基础上,要多分配一个字符,用于保存NULL字符,如果没有多分配这个字符,会导致拷贝到dst的时候,踩一个字节的内存。
4、src没有NULL字符,会一直拷贝下去,直到遇到NULL字符,怎么解决这个问题?
使用strncpy,表示最多拷贝n个字节。如果不到n个字节,遇到src中的NULL字符,结束拷贝,并且从当前点到n位置,补充NULL。这一点和memory拷贝不同,memcpy不管src的取值,都会拷贝n个字节。
5、注意:
string src ="abcdabcd";
char* dst = new char[8];

strcpy(dst,src.c_str()); // 踩内存,src多出一个NULL,而dst分配的内存不够
strncpy(dst,src.c_str(),8);// 不踩内存
memcpy(dst,src.c_str(),8); // 不踩内存
strncpy和memcpy不踩内存,但是会导致dst没有结束符。这往往会出现问题,比如dst再拷贝到其他地方。因此,解决办法最好是 dst多分配一个字符,用于保存NULL,并且初始化dst,如下:
char* dst = new char[src.size()+1];
memset(dst,0,src.size()+1);

转载于:https://www.cnblogs.com/nzbbody/p/4604633.html

memory拷贝与string拷贝的区别相关推荐

  1. 引用拷贝、浅拷贝和深拷贝区别

    类型 拷贝一般分为二大类 引用拷贝 和 对象拷贝,我们通常讲的深拷贝和浅拷贝都属于对象拷贝. 引用拷贝 顾名思义,即是对引用地址的拷贝,说明引用地址一样,指向堆中的对象是同一个对象. 如果对一个对象进 ...

  2. python中复制、浅层拷贝、深层拷贝的区别

    python中复制.浅层拷贝.深层拷贝的区别 一.学习要点: 1.python中的复制与拷贝的区别 2.python中浅层拷贝与深层拷贝的区别 二.代码: import copy a=[1,2,3,4 ...

  3. 运算符重载——拷贝构造函数与赋值运算符的区别、如何实现赋值运算符的深拷贝

    目录: 运算符重载--算术运算符重载 运算符重载--递增运算符重载 运算符重载--左移运算符重载 运算符重载--赋值运算符重载 写在前面 1)C++的编译器会默认给一个类提供4个函数 默认构造函数(无 ...

  4. 拷贝和引用有什么区别php,拷贝和复制有什么区别

    拷贝和复制有什么区别? 拷贝和复制是一样的,没有区别,只是叫法不同:拷贝(kǎobèi)是由英文copy的音译词,copy意为复制.摹本. 拷贝有四种解释: ①是一个计算机系统的DOS命令,意为&qu ...

  5. 引用拷贝、对象拷贝、浅拷贝、深拷贝 到底是什么【详细例子介绍】

    首先要知道的: Java的数据类型分为基本数据类型和引用数据类型. 拷贝一个对象,可以使用 Cloneable接口的clone()方法. 对象拷贝分为 浅拷贝 和 深拷贝,这两种拷贝都是从引用拷贝 引 ...

  6. 【C++11智能指针】shared_ptr的初始化、拷贝构造和拷贝赋值、移动构造和移动赋值

    文章目录 1.智能指针概述 2.shared_ptr的初始化 2.1 shared_ptr和new结合使用(直接初始化) 2.2 make_shared函数 3.shared_ptr的拷贝构造和拷贝赋 ...

  7. C++——构造函数(拷贝构造,拷贝复制),析构函数,操作符重载

    C++--构造函数(拷贝构造,拷贝复制),析构函数,操作符重载 构造函数与析构函数:: 涉及构造函数还可以看这篇文章C++搞懂深拷贝初始化=与赋值=的区别 1.声明和定义构造函数和析构函数 构造函数在 ...

  8. C++ Primer 5th笔记(chap 13 拷贝控制)拷贝构造函数

    1. 拷贝构造函数 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数. class Foo{public:Foo();//默认构造函数 (仅在程序员 ...

  9. 深度拷贝 java_Java深度拷贝方式和性能对比

    前言 Java的深度拷贝大致分为克隆(实现Java的Clone接口)和序列化(实现Java的Serializable接口)两种,但是基于不同的序列化方式,有可以延伸出几种方式.下面分析一下每种的注意事 ...

最新文章

  1. http://blog.csdn.net/chrisniu1984/article/details/12050951
  2. 设计模式之单例模式8种实现方式,其八:枚举方式
  3. MAC Eclipse 快捷键
  4. 重点推荐:HP大中华区总裁孙振耀退休感言
  5. spring web.xml配置服务启动后执行文件
  6. 分量入度hdu 3836 Equivalent Sets
  7. 自己动手制作USB启动盘
  8. 三星电视刷android,三星电视如何能够自由安装安卓应用呢
  9. 全源最短路 Johnson算法
  10. 获取企业微信code
  11. 论window10如何获得最高权限
  12. java hl7v3_HL7标准V3开发框架中个模型的关系
  13. 【SSL】2021-08-19 1100.神秘数列
  14. unicloud进阶uni-id入门(一)---uni-id能做什么?
  15. 【2019.06.21】基于Airtest的微信朋友圈自动点赞脚本设计与实现 2019.06.21脚本正常运行
  16. 系统设计面试题之 怎么设计一个打分系统
  17. 限制Editext输入字节长度
  18. 小米路由器微信连接到服务器,小米路由器怎么设置微信好友免密码直接链接上网?...
  19. 什么是API,开发人员该如何使用它们?
  20. 输入字符,如果是大写则转化为小写,如果是小写则转化为大写

热门文章

  1. atitit.短信 验证码  破解  v3 p34  识别 绕过 系统方案规划----业务相关方案 手机验证码  .doc...
  2. 01_jeecms建站
  3. 中国象棋程序的设计与实现(五)--回答CSDN读者的一些问题
  4. 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和...
  5. 从全栈式解决方案到情感化,揭秘问众智能切入车载语音市场的最佳姿势...
  6. es6中class类的全方面理解(三)------静态方法
  7. [hadoop] kettle spoon 基础使用 (txt 内容抽取到excel中)
  8. POJ2190 HDU2714 ISBN
  9. 火狐浏览器Firefox如何使用插件,火狐有哪些好用的插件
  10. 项目开发容易出错情况统计