c++ new 的用法的问题

问题描述

c++ new 的用法的问题
char*p=new char[2];//p指针是指向一个两个字符长度的指针
strcpy(pasd"");
cout<<p
结果输出是asd,p指针不是只指向含有含有两个字符的之真忙,为什么还能输出asd

解决方案

strcpy不会检查缓冲区长度,所以它不安全,应该废弃它,使用strncpy,它会根据你提供的长度截断字符串,避免超长。

解决方案二:
strcpy就是buffer overflow的一个源头,因为它会导致拷贝超过长度数据。可以用strncpy或者windows上面用strncpy_s。这个更安全。

解决方案三:
strcpy(pasd""); 在此段代码中会引起内存操作的越界。
小范围的越界,可能不会引起严重的问题。但越界后,会引起程序中其它变量数值的变化。如果影响的变量是一个指针,再后续对此指针操作时可能会引起错误导致程序异常退出。】

C语言,指针是十分强大的,但 C 语言不对指针做越界判断的。

解决方案四:
strcpy不会检测长度,用strcpy函数

解决方案五:
在vs上,strcpy函数会报错,会建议strcpy_s();

解决方案六:
首先你是用了new动态分配的函数,动态分配内存时会在首地址的后边空出一大片内存区域,strcpy()函数不检查越界。如果你是用free()函数将动态内存释放后,你会发现p的值还在,一直到这片内存被其他变量覆盖时,p的值才改变。这就是动态分配内存的特点。

解决方案七:
那是因为当前读写的虚拟内存页面的访问规则是运行读写的,Windows(以Windows为例,你可以理解为我只会Windows上的)为虚拟内存的每一个页面设置了一个访问规则,我们知道应用程序访问的内存永远是4G的虚拟内存,而且只有一半的空间(2G)可以用,系统只允许内核程序访问物理内存(例如驱动可以这么做,但实际上,很少有驱动会访问物理内存),因此对于每个进程而言,a进程的一个内存地址所在页面和b进程的同样地址所在页面被系统映射到了不同的物理内存(分页内存在条件满足的时候系统会酌情映射到磁盘上),系统会为每一个虚拟内存页面设置一个“虚拟内存访问规则”,也就是“内存虚拟保护”,访问规则包括读(read),写(write),让CPU执行代码(execute),这三种规则可以自由组合(应用程序可以使用VirtualProtect这个API修改指定页面的虚拟内存访问规则),当一个程序访问了它不该访问的内存时,会产生“虚拟内存违规访问”,从而导致程序崩溃(在xp下就非常人性化的弹出xxx程序在xxx处指令访问的xxx内存,此内存不能为“read/write”),而我上面也说了,访问规则是对于一个内存页面而言的,一个页面应该有4k(如果我没记错),而你的p指针指向的位置只要不倒霉到指向了页面的尾部,那么即使超出了字符串,只要没超出这个页面,就不会发生虚拟内存违规访问,因此不会出现问题,当然,有可能损坏其他数据而引发未定义的行为

解决方案八:
strcpy不会检测长度,换一种吧

时间: 2024-12-27 20:31:10

c++ new 的用法的问题的相关文章

python中enumerate函数用法实例分析

  本文实例讲述了python中enumerate函数用法.分享给大家供大家参考.具体分析如下: 今日发现一个新函数 enumerate .一般情况下对一个列表或数组既要遍历索引又要遍历元素时,会这样写: ? 1 2 for i in range (0,len(list)): print i ,list[i] 但是这种方法有些累赘,使用内置enumerrate函数会有更加直接,优美的做法,先看看enumerate的定义: ? 1 2 3 4 5 6 7 def enumerate(collect

php中$this、static、final、const、self的用法

  本篇文章主要分项了一下关于php类中的$this,static,final,const,self这几个关键字使用方法. $this $this表示当前实例,在类的内部方法访问未声明为const及static的属性时,使用$this->value='phpernote';的形式.常见用法如: $this->属性 $this->方法 举例如下:  代码如下   <?php class MyClass{  private $name;  public  function __cons

文件/目录权限设置命令chmod的详细用法

chmod是文件/目录权限设置的命令,在Linux中经常遇到,本博文以下总结chmod的详细用法.  Linux/Unix的档案调用权限分为三级,即档案拥有者user.群组group.其他other.u表示该档案的拥有者,g表示与该档案的拥有者属于同一个群体(group)者,o表示其他以外的人,a表示这三者皆是. + 表示增加权限.- 表示取消权限.= 表示唯一设定权限. r表示可读取,w表示可写入,x表示可执行.   举例说明: (1).将档案file1.txt 设为所有人皆可读取: chmo

Html5 CSS3新标签解释及用法

HTML 5 是一个新的网络标准,目标在于取代现有的 HTML 4.01, XHTML 1.0 and DOM Level 2 HTML 标准.它希望能够减少浏览器对于需要插件的丰富性网络应用服务(plug-in-based rich internet application,RIA),如Adobe Flash, Microsoft Silverlight, 与 Sun JavaFX 的需求. HTML 5 提供了一些新的元素和属性,反映典型的现代用法网站.其中有些是技术上类似 <div> 和

Emacs之魂(二):一分钟学会人界用法

Emacs之魂(一):开篇Emacs之魂(二):一分钟学会人界用法Emacs之魂(三):列表,引用和求值策略Emacs之魂(四):标识符,符号和变量Emacs之魂(五):变量的"指针"语义Emacs之魂(六):宏与元编程Emacs之魂(七):变量捕获与卫生宏Emacs之魂(八):反引用与嵌套反引用Emacs之魂(九):读取器宏 上文提到了编辑器之战, 据江湖传说,Emacs被称为"神的编辑器", Emacs有着无与伦比的可扩展性和可定制性,简直变成了一个"

vb和Excel简单运用嗯宏的用法

问题描述 vb和Excel简单运用嗯宏的用法 如何在点击Excel时运行已经录制的宏,在宏里面输入什么代码,求后台代码,求大神 解决方案 1.录制好宏,并取名. 2.在Excel文件的VBA环境中,双击ThisWorkbook进入代码窗口. 3.写入下列代码: Private Sub Workbook_Open() '已经录制的宏 End Sub

详解CSS中@supports的用法

基于浏览器的特性检测大家应该已经很熟悉了,特别是modernizr.js推出来之后.其实w3c也出了规范,可以基于css来做一些特性检测,也就是@supports,这个特性已经有两年多了,之前浏览器支持度不够,现在webkit nightly也开始支持了,也就是说safari 9会支持到,这样的话,Blink+webKit+gecko都支持了,只剩下IE浏览器不支持了,嗯,这样更方便对IE差异化处理了. 但是@supports并不能完全替代JS的特性检测方法,它只支持对CSS属性的检测,其它HT

Excel中sumif函数用法

今天接着给大家来关于Excel中sumif函数用法的操作技巧,那么就有人问了,学会了Excel中sumif函数用法有什么作用呢,不要急,下面就请听小编一一给大家进行详细的讲解: 一.SUMIF函数介绍 SUMIF函数根据指定条件对若干单元格求和,该条件可以是数值.文本或表达式,可以应用在人事.工资和成绩统计中. 二.SUMIF函数用法 sumif函数语法是:SUMIF(range,criteria,sum_range) 第一个参数:Range为条件区域,用于条件判断的单元格区域. 第二个参数:C

Oracle中GROUP BY的高级用法

前面介绍了分组函数的基本用法,下面介绍几种关于GROUP BY更高级的用法. 1.ORACLE数据库中的ROLLUP配合GROUP BY命令使用,可以提供信息汇总功能(与"小计" 相似) SQL> SELECT deptno, job,sum(sal) from emp1 group by deptno,job 2  order by deptno,job; DEPTNO JOB                           SUM(SAL) ---------- ----

&amp;amp;quot;package中的javac,java用法&amp;amp;quot; &amp;amp;amp;&amp;amp;amp; &amp;amp;quot;制作可执行jar文件&amp;amp;quot;

执行 java初学者最早会用的命令无非是就是javac和java,但即使这么简单命令也还会把我们弄得头皮发麻 -__- .Roger下面就"package中的javac,java用法"和"制作可执行jar文件"做点简单的解释. 最基础的东西就不废话了,至于package先讲讲我的理解,因为我觉得知道这点对于开发还是很有帮助的.举个例子说:有两个类Tom和Jerry同属于一个package--Partners //Tom.javapackage Partners;pu