c++ 用new后delete,而继续输出指针后果 new/new[]/delete/delete[]区别
#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[]区别的更多相关文章
- 栈 堆 stack heap 堆内存 栈内存 内存分配中的堆和栈 掌握堆内存的权柄就是返回的指针 栈是面向线程的而堆是面向进程的。 new/delete and malloc/ free 指针与内存模型
小结: 1.栈内存 为什么快? Due to this nature, the process of storing and retrieving data from the stack is ver ...
- STM8S PWM输出停止后 IO口电平输出
STM8S有许多定时器支持PWM输出,但在停止定时器后,IO口电平到底是多少呢?或高或低. 因此,为了确定PWM停止输出电平后其对应的值是多少,我们在停止PWM输出时需要对CCMR1寄存器进行设置. ...
- 843. n-皇后问题(dfs+输出各种情况)
n-皇后问题是指将 n 个皇后放在 n∗n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行.同一列或同一斜线上. 现在给定整数n,请你输出所有的满足条件的棋子摆法. 输入格式 ...
- 解决在SecurecCRT登录后,发现方向键、backspace(退格键)、delete(删除键)为乱码的问题
问题:使用securecrt ssh到linux之后,backspace(退格键),delete(删除键),以及4个方向键都为乱码,不能正常使用.按tab键也没有自动补全文件名. 即: 按Backsp ...
- 尝试解决IDea 启动项目后,后台疯狂输出日志。
今天启动项目的时候,昨天下班前还好好,然后今天就炸了.后台疯狂输出日志.. 就类似这种,大批量的刷.其实项目已经正常启动了,就是疯狂的刷日志. 2019-03-29 08:42:53 [DEBUG] ...
- 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 ...
- 使用prompt输入一句英文句子和排序方式(升/降),将所有单词按排序方式排序后在网页上输出
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 输入a、b、c三个整数,按先大后小的顺序输出a、b和c。注意请使用指针变量的方式进行比较和输出。
`void swap(int *a,int *b,int c){ if(a < *b){ int temp = *a; //防止temp没有初始化 随机存放地址指向系统工作区间 可以对temp初 ...
- python屏幕的交互(读取输出信息)input,raw_input的区别
>>> input("your name?") your name?sam Traceback (most recent call last): File & ...
随机推荐
- bzoj 2655 calc——拉格朗日插值
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2655 先考虑DP.dp[ i ][ j ]表示值域为 i .选 j 个值的答案,则 dp[ ...
- 洛谷【P1048】采药
浅谈\(DP\):https://www.cnblogs.com/AKMer/p/10437525.html 题目传送门:https://www.luogu.org/problemnew/show/P ...
- Visualforce Page超链接
Salesforce开发者文档:https://developer.salesforce.com/docs/atlas.en-us.pages.meta/pages/pages_quick_start ...
- laravel 多个where的连接使用
在查询的时候需要用到多个where条件来查询 1.直接多个where连接 ->where()->where() 2.把查询条件 放到where数组$where中 然后 ->where ...
- 利用DNS进行传输数据
曾经有这样一道题目,困了我数个小时,最后我尝试利用此方法时我知道真相的时候,眼泪已掉下来. 遇到的是一个流量分析题,分析DNS数据,拿到flag 流量如图所示: 进入linux,提取: [root@s ...
- SqlServer——事务一进阶之锁的概念(SqlServer技术内幕 T-SQL程序设计 第九章)
一.事务的概念及ACID特性 对于单独一条SQL语句,数据库会隐式的将其作为事务,即该SQL语句要么执行成功,要么失败(相当于不执行),而我们通常说的事务就是将多条SQL语句放在 begin ...
- DDD学习笔录——简介领域驱动设计的实践与原则
DDD在存在许多DDD模式的同时,也有大量实践和指导原则,这些都是DDD思想体系成功的关键. 1.专注于核心领域 DDD强调的是在核心子域付出最多努力的需要.核心子域是你的产品会成功还是会失败的差异化 ...
- leetcode590
树的后序遍历. class Solution { public: vector<Node> Tree; void postTree(Node node) { for (auto n : n ...
- jQuery的AJax异步加载
主要用到load()方法以及getScript()方法,具体以一个例子说明: 在现有html文件中加载一个拟好的片段,以及在片段加载完成之前阻止用户进一步操作的弹出框. 首先是现有html代码,无任何 ...
- tortoisesvn 本项目的忽略项
https://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-propertypage.html Adding and Editing Pr ...