#include<iostream>
#include<cstring>
#include <string.h> int main(){ int *a =new int[];
for(int i=;i<;i++){a[i]=i;}
char *b;
delete []a;
for(int i=;i<;i++){
b=new char [];
b="dfdf";} for(int i=;i<;i++){cout<<a[i]<<endl;}
cout<<endl<<a; }

所以不要这样

 #include<iostream>
#include<cstring>
#include <string.h>
using namespace std;
class Cbox{
char * aa;
public:
int g ;
Cbox(const char *a){int length =(strlen(a)+);
aa= new char[length +];
strcpy(aa,a);
cout<<"gouzao"<<endl;}
Cbox()=default;
~Cbox(){delete aa;cout<<"xigou"<<endl;}
void show(){cout<<aa<<endl;}
}; void display (Cbox a){
a.show();} int main(){
char as[]="""asd1200";
Cbox a(as) ; display(a);
a.show();
}

因为这里实参是通过传值方式传递的,会用默认构造函数创建实参的副本,副本的指针跟实参的指针指向空闲存储器中同一个字符串。 超出函数作用域后,副本会析构,使副本里 的指针 指向的内存被释放。  但实参还是指着那个位置,所以可能出错。

malloc/new/new[] 申请了一块内存的时候,编译器实际上会在这块内存的头部保存一个 size_t 信息,记录了这块内存的大小。这个size信息是需要占用额外的空间的

在对 p指针进行free/delete/delete []操作的时候,实际上会先通过 *(p-sizeof(size_t))来获得这块内存的大小,然后将内存归还给系统。

如果是内置类型 int char   用delete 和delete[]没区别

如果是类类型 有析构函数那些就有区别了。  delete只会对第一个对象调用析构函数,然后释放掉这一整块内存的空间(包括那些没执行析构函数的对象。(第二个第三个。。。。))

delete[]则会对每个对象都执行析构函数,然后释放掉这一整块内存的空间。

对于下面的两行代码:

Base * p = new Derived();
delete p;

如果derived有虚析构函数,那么deletep会调用虚析构函数

Base * p = new Derived[10];
delete [] p;

但当用数组时这里就有问题了,会出现内存访问错误。原因在于在执行 delete [] p的时候,实际上是这么执行的:

for (int i = 0; i < memory_size; i = i + sizeof(Base)) {
(Base *)((void * ) p + i)->~();
}
free(p);

在对数组中第一个对象执行析构函数的时候,结果是正常的;但是在对第二个对象执行析构函数的时候,由于Base对象和Derived对象的大小并不相同,(Base *)((void * ) p + i)并不能找到虚表的地址——这个指针实际指向的并不是第二个Derived对象的开头,而是第一个Derived对象结尾的几个字节!程序会错误地把这末尾的几个字节的内容当做虚表的地址,所以会引发内存访问错误。

作者:starays
链接:https://www.jianshu.com/p/fbf6cad613e9
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

c++ 用new后delete,而继续输出指针后果 new/new[]/delete/delete[]区别的更多相关文章

  1. 栈 堆 stack heap 堆内存 栈内存 内存分配中的堆和栈 掌握堆内存的权柄就是返回的指针 栈是面向线程的而堆是面向进程的。 new/delete and malloc/ free 指针与内存模型

    小结: 1.栈内存 为什么快? Due to this nature, the process of storing and retrieving data from the stack is ver ...

  2. STM8S PWM输出停止后 IO口电平输出

    STM8S有许多定时器支持PWM输出,但在停止定时器后,IO口电平到底是多少呢?或高或低. 因此,为了确定PWM停止输出电平后其对应的值是多少,我们在停止PWM输出时需要对CCMR1寄存器进行设置. ...

  3. 843. n-皇后问题(dfs+输出各种情况)

    n-皇后问题是指将 n 个皇后放在 n∗n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行.同一列或同一斜线上. 现在给定整数n,请你输出所有的满足条件的棋子摆法. 输入格式 ...

  4. 解决在SecurecCRT登录后,发现方向键、backspace(退格键)、delete(删除键)为乱码的问题

    问题:使用securecrt ssh到linux之后,backspace(退格键),delete(删除键),以及4个方向键都为乱码,不能正常使用.按tab键也没有自动补全文件名. 即: 按Backsp ...

  5. 尝试解决IDea 启动项目后,后台疯狂输出日志。

    今天启动项目的时候,昨天下班前还好好,然后今天就炸了.后台疯狂输出日志.. 就类似这种,大批量的刷.其实项目已经正常启动了,就是疯狂的刷日志. 2019-03-29 08:42:53 [DEBUG] ...

  6. iis部署网站后出现未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\106f9ae8\cc0e1

    在本地开发环境没问题,但是发布到服务器出现:未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Fil ...

  7. 使用prompt输入一句英文句子和排序方式(升/降),将所有单词按排序方式排序后在网页上输出

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 输入a、b、c三个整数,按先大后小的顺序输出a、b和c。注意请使用指针变量的方式进行比较和输出。

    `void swap(int *a,int *b,int c){ if(a < *b){ int temp = *a; //防止temp没有初始化 随机存放地址指向系统工作区间 可以对temp初 ...

  9. python屏幕的交互(读取输出信息)input,raw_input的区别

    >>> input("your name?") your name?sam Traceback (most recent call last):   File & ...

随机推荐

  1. QtCreator开启-O编译优化的方式

    首先,编译优化必须是在Release模式下进行,保证程序没有任何bug的条件下进行执行.编译优化能极大提升程序的运行效率,级别越高速度越快,但是对代码健壮性要求也越高! 选择编译release模式,在 ...

  2. Oracle 常见进程

    1 服务器进程 专用服务器连接:数据连接跟服务器上的一个进程之间存在1:1的映射 共享服务器连接:多个会话共享一个服务器进程池,由一个调度程序分配 1.1 专用服务器连接 专用服务器连接模式下,客户连 ...

  3. DataGridView上下方向键定位

    /// <summary> /// DataGridView上下方向键定位 /// </summary> /// <param name="dgv"& ...

  4. Drools学习笔记3—Conditions / LHS—字段约束连接&字段约束操作符

    字段约束连接 用于字段约束 对象内部多个约束连接,采用“&&”(and).“||”(or)和“,”(and) 执行顺序:“&&”(and).“||”(or)和“,” 字 ...

  5. Ok6410裸机驱动学习(三)C语言内嵌汇编

    1.C语言内嵌汇编使用方法 C内嵌汇编以关键字”_asm_或asm开始,下辖4个部分,各部分之间用“:”分开,第一部分是必须写的,后面3个部分可以省略,但是分号:不能省略 优化后的代码 2.汇编程序框 ...

  6. hive与hbase整合方式和优劣

    分别安装hive 和 hbase 1.在hive中创建与hbase关联的表 create table ganji_ranks (row string,num string) STORED BY 'or ...

  7. java线程游戏之背景图片的移动

    package com.plane; import java.awt.Graphics; import java.awt.Image; import javax.swing.ImageIcon; im ...

  8. import json

  9. wamp配置小细节

    1. 问题:在安装后,把phpMyadmin改密码后,再次登陆会提示出错.访问被拒绝. 原因:这是因为WampServer设置了直接登陆. 解法:修改config.inc.php文件中$cfg['Se ...

  10. Codeforces 1108F (MST Unification) (树上倍增 or 改进 kruksal)

    题意:给你一张n个节点和m条边的无向连通图, 你可以执行很多次操作,对某一条边的权值+1(对于每条边,可以不加,可以无限次加),问至少进行多少次操作,可以使这张图的最小生成树变得唯一,并且最小生成树的 ...