这里举个例子查看内存,

环境为:vs 2017 测试为strcpy【因为测试老api,需要在 预处理中 添加 _CRT_SECURE_NO_WARNINGS 】

测试问题:内存溢出

源码:

#include <iostream>
#include <stdlib.h>
#include <string>

#define MY_STR "hello"
#define YOUR_STR "boom"
#define NUMBERS "0123456789"
#define MAX_LENGTH 12
using namespace std;

void changed_str(char *szArry,const char *Data)
{
cout << "before copy data " << endl;
strcpy(szArry, Data);
cout << "after copy data " << endl;
}
int main()
{

char Arry[MAX_LENGTH] = { 0 };

/*
changed_str(Arry, MY_STR);

cout << Arry << endl;

memset(Arry,0,strlen(Arry));

changed_str(Arry, YOUR_STR);

cout << Arry << endl;

*/
strcpy(Arry, NUMBERS);

strcpy(Arry+3, Arry);
for (int i=0;i<sizeof(Arry);i++)
  cout << Arry[i] << endl;

system("pause");
return 0;
}

现在是给足长度的数组,然后进行拷贝,成功拷贝字符串,并没有发现问题。

现对比,长度不够,然后拷贝字符串:

内存溢出如果没有踩内存是没有蹦的

接下来是查看内存重叠strcpy

为了方便做对比先列下strcpy原理【非常暴力毫无安全可言,旧版本的,现在新版本的估计已经替换了】:

甚至没有做校验assert,直接拿来测试会死循环

void strcpy( char *strDest, char *strSrc )   

 {   

  while( (*strDest++ = * strSrc++) != ‘\0’ );   

 }

strcpy(a+3, a); 内存重叠

开始拷贝:

a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}  //注意这里a的长度是12

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

直到第六次拷贝:

a[7] = a[4] // a[4]值为 1

a[] = {0, 1, 2, 0, 1, 2, 3, 7, 8, 9}

{0, 1, 2, 0, 1, 2, 3, 7, 8, 9}

a[9] = a[6] // a[6]值为 3

a[] = {0, 1, 2, 0, 1, 2, 3, 1, 2, 3}

{0, 1, 2, 0, 1, 2, 3, 7, 8, 9}

a[10] = a[7] // a[7]值为 7

a[] = {0, 1, 2, 0, 1, 2, 3, 1, 2, 3, 7}

{0, 1, 2, 0, 1, 2, 3, 7, 8, 9}

a[11] = a[8] // a[8]值为 2 为什么这里数组a[8]刷新了? 同步了上面

a[] = {0, 1, 2, 0, 1, 2, 3, 1, 2, 3, 7}

{0, 1, 2, 0, 1, 2, 3, 7, 2, 9}

a[12]  = a[9] // a[9] 值为 3

a[] = {0, 1, 2, 0, 1, 2, 3, 1, 2, 3, 7, 2, 3}

{0, 1, 2, 0, 1, 2, 3, 1, 2, 3, 7, 2, 3}

a[13]  = a[10] // a[9] 值为 7

a[] = {0, 1, 2, 0, 1, 2, 3, 1, 2, 3, 7, 2, 3, 7}

{0, 1, 2, 0, 1, 2, 3, 1, 2, 3, 7, 2, 3, 7}//这里长度应该跟上面一样的

同一个数组踩内存这里不会崩溃,也不会出现其他问题,还可以正常输出,如果是不同的变量,可能会引起程序崩溃,

所以建议使用strcpy_s安全版本拷贝,或者使用strcpy的时候自己增加外部校验判断参数合法性。

此处只做总结分享。

C++ 浅析调试,内存重叠查看的更多相关文章

  1. Instruments指南:如何调试内存泄露

    Instruments指南:如何调试内存泄露 开篇 现在,你应该使用的ARC,而不是原来我们使用的MRC或者其他.但是我们在使用ARC的时候也会出现内存泄露的情况. 幸运的是,苹果为我们提供了Inst ...

  2. linux共享内存的查看与删除

    在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误.您可以使用shell命令来查看与释放已经分配的共享内存,下面将详细说明如何进行查看和释放分配的共享内存的方法. 预备知识 L ...

  3. Android学习系列(37)--App调试内存泄露之Context篇(下)

    接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...

  4. 用"僵尸对象"调试内存管理问题

    Cocoa提供了"僵尸对象"(Zombie Object)这个功能.启用这项调试功能之后,运行时系统会把所有已经回收的实例转化成特殊的"僵尸对象",而不会真正回 ...

  5. C++中两块内存重叠的string的copy方法

    如果两段内存重叠,用memcpy函数可能会导致行为未定义. 而memmove函数能够避免这种问题,下面是一种实现方式: #include <iostream> using namespac ...

  6. 移动端页面 iPhone + Safari 页面调试 之 正确查看网络请求的姿势

    如题 本文主要将 Safari + iPhone 前端开发调试  之 正确查看网络请求的 姿势 惯例 说下问题场景: 早知道safari(Mac) + iPhone 调试的方便 能解决很多日常调试问题 ...

  7. memmove 和 memcpy的区别以及处理内存重叠问题

    区别: memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void *memcpy(void *dst, const v ...

  8. [整理]内存重叠之memcpy、memmove

    函数原型: void *memcpy( void *dest, const void *src, size_t count ); void *memmove( void* dest, const vo ...

  9. 浅析JVM内存区域及垃圾回收

    一.JVM简介 JVM,全称Java Virtual Machine,即Java虚拟机.以Java作为编程语言所编写的应用程序都是运行在JVM上的.JVM是一种用于计算设备的规范,它是一个虚构出来的计 ...

随机推荐

  1. Android Lint Problem

    问题概述: Type: Android Lint Problem   解决方法: select problems -> quick fix-> Clear Lint Markers

  2. 终极解决方案: Invalid character found in the request target.

    终极解决方案:(导出可能出现) 我的tomcat版本是8.5.32,导出时遇到以下报错. 报错日志: Invalid character found in the request target. Th ...

  3. getJSON方式请求服务器

    register.jsp <%@ page language="java" import="java.util.*" pageEncoding=" ...

  4. Java Web学习总结(2)Servlet(一)

    一,Servlet 简介 Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间 ...

  5. 网站升级HTTPS教程

    远程桌面连接工具 由于运营商的肆意劫持,越来越多的网站开始使用HTTPS协议,开启HTTPS会优待提升排名,我减少被劫持页面等等   现在越来越多的网站开始使用HTTPS协议,其实百度从2014年底就 ...

  6. 攻防世界 | CAT

    来自攻防世界官方WP | darkless师傅版本 题目描述 抓住那只猫 思路 打开页面,有个输入框输入域名,输入baidu.com进行测试 发现无任何回显,输入127.0.0.1进行测试. 发现已经 ...

  7. Docker 进入容器的4种方法

    在使用Docker创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入Docker容器有好几多种方式,这里我们就讲一下常用的几种进入Docker容器的方法. 进入Docker容器比较常见的几种 ...

  8. (二)linux内核准备及编译

    1. 内核下载地址 linux内核网站,可以拿到最新的和最近的稳定版本内核: https://www.kernel.org/ 通过网站下载压缩包后解压或者使用git下载到本地: git clone h ...

  9. 九. jenkins用户权限管理

    由于jenkins默认的权限管理体系不支持用户组和角色的配置,所以需要使用第三方插件来支持角色的配置: Role-based Authorization Strategy 1.先安装插件,如下: 2. ...

  10. C语言基本数据类型大小

    C语言基本数据类型占用的字节数可以通过如下例子获取: #include<stdio.h> int main(void) { printf("char size=%d \n&quo ...