C++中new与delete问题学习
一.new char与delete问题
. 问题程序
[cpp] view plaincopy
#include <iostream> using namespace std; void main() { char* des = new char(); des = "testing!"; cout<<des<<endl; delete des; //这个delete需要吗 } . 错误
当运行到delete时,程序出错! . 解答
v1
你用new申请了一个char空间,把它的地址保存在了des这个指针里面
然后你又把"testing!"这个常量字符串的地址赋给了des这个指针
于是,你之前用new申请的那个空间就丢失了,在程序结束系统回收全部内存前,那个空间就被标明被你使用但实际上你已经丢失它的地址没办法再使用它了,这就是最常见的内存泄露
delete出错理所当然,因为你delete的不是你new的那个空间。甲被乙骗了钱不能去法院起诉丙,丙是无辜的 v2
.
char* des = new char();
应该只分配一个byte的空间,而后面的des = "testing!";我猜楼主的意图是要将"testing!"放入des所指向的空间,很显然实际上是放不下去的。之所以输出有没有问题,是刚好将"testing"的首地址给了des,这就改变des的值,也就是des = "testing!"中的des,和前面的char* des = new char();已经不同了。 . 正确代码
V1
[cpp] view plaincopy
#include <iostream> using namespace std; void main() { char* des = new char[]; memset(des, , ); strcpy(des, "testing!"); cout << des << endl; delete des; } V2 严格版 [cpp] view plaincopy
#include <iostream> using namespace std; void main() { char* des = new char[]; memset(des, , ); strcpy(des, "testing!"); cout << des << endl; delete[] des; // new[]和delete[]对应。但由于char是基本数据类型,所以6楼那样写应该也是没有问题的 } 二.new int与delete
. 程序
[cpp] view plaincopy
#include <iostream> using namespace std; void main() { //一维整型指针 int *a = new int []; for (int i=;i<;i++) { a[i] = ; } for (int i=;i<;i++) { printf("%d \n",a[i]); } delete[] a; //二维整型指针 int **b = new int *[]; for (int i=;i<;i++) { b[i] = new int []; } for (int i=;i<;i++) { for (int j=;j<;j++) { b[i][j] = ; } } for (int i=;i<;i++) { for (int j=;j<;j++) { printf("%d ",b[i][j]); } printf("\n"); } for (int i=;i<;i++) { delete[] b[i]; } delete[] b; system("pause"); } . 程序运行正常
除char以外的基本数据类型,在进行指针释放时一般不用考虑太多,主要是因为没有字符串的赋值(实质是地址的赋值)。 三.小结
在new的类型中,涉及到地址赋值,要千万小心!
四、使用陷阱
new和delete成对使用,避免内存泄露,申请内存数组时使用的"[]"而非“()”。如下:
char * szData=new char(); (错误)
char *szData=new char[];(正确)
int**a = new int*[2];
for(int i=0;i<2;i++){
*(a+i) = new int[3]; //a[i] = new int[3];
for(int j=0;j<3;j++){
*(*(a+i)+j) = j; //a[i][j] = j;
}
}
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
cout<<"a["<<i<<"]["<<j<<"]="<<*(*(a+i)+j)<<endl;
}
cout<<endl;
}
C++中new与delete问题学习的更多相关文章
- python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie)
python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie) 主要包括两部分内容:(1)利用python中的dict实现Trie:(2) ...
- java中File的delete()方法删除文件失败的原因
java中File的delete()方法删除文件失败的原因 学习了:http://hujinfan.iteye.com/blog/1266387 的确是忘记关闭了: 引用原文膜拜一下: 一般来说 ja ...
- 数据库设计中的Soft Delete模式
最近几天有点忙,所以我们今天来一篇短的,简单地介绍一下数据库设计中的一种模式——Soft Delete. 可以说,该模式毁誉参半,甚至有非常多的人认为该模式是一个Anti-Pattern.因此在本篇文 ...
- c++中new和delete的使用方法
c++中new和delete的使用方法 new和delete运算符用于动态分配和撤销内存的运算符 new用法: 1. 开辟单变量地址空间 1)new int; //开辟一个存放数组的存储空间 ...
- C++中的new/delete与operator new/operator delete
new operator/delete operator就是new和delete操作符,而operator new/operator delete是函数. new operator(1)调用opera ...
- oracle中drop、delete和truncate的区别
oracle中drop.delete和truncate的区别 oracle中可以使用drop.delete和truncate三个命令来删除数据库中的表,网上有许多文章和教程专门讲解了它们之间的异同,我 ...
- C++中的new/delete
不同于C语言中的malloc/free是库函数,C++语言中的new/delete是运算符,而不是库函数. new/delete执行流程 我们经常会接触到的是new/delete operator(就 ...
- (原)关于MEPG-2中的TS流数据格式学习
关于MEPG-2中的TS流数据格式学习 Author:lihaiping1603 原创:http://www.cnblogs.com/lihaiping/p/8572997.html 本文主要记录了, ...
- 数据库中drop、delete与truncate的区别
数据库中drop.delete与truncate的区别 drop直接删掉表: truncate删除表中数据,再插入时自增长id又从1开始 :delete删除表中数据,可以加where字句. (1) D ...
随机推荐
- A Spy in the Metro
题意: n个车站,已知到达相邻车站的时间,有m1辆车从1站出发已知发车时间,有m2辆车从n站出发已知发车时间,求从1到达n所需等车的总时间最小. 分析: 有三种情况,在原地等,乘左到右的车,乘右到左的 ...
- HDU 5730 Shell Necklace cdq分治+FFT
题意:一段长为 i 的项链有 a[i] 种装饰方式,问长度为n的相连共有多少种装饰方式 分析:采用dp做法,dp[i]=∑dp[j]*a[i-j]+a[i],(1<=j<=i-1) 然后对 ...
- Javascript——说说js的调试
最近比较吐槽,大家都知道,现在web前端相对几年前来说已经变得很重了,各种js框架,各种面对对象,而且项目多了,就会提取公共模块. 这些模块的UI展示都一样,不一样的就是后台逻辑,举个例子吧,我们做企 ...
- bzoj 3365 [Usaco2004 Feb]Distance Statistics 路程统计(点分治,单调)
[题意] 求树上长度不超过k的点对数目. [思路] 和 Tree 一样一样的. 就是最后统计的时候别忘把根加上. [代码] #include<set> #include<cmath& ...
- wireshark http过程
一直研究lighttpd源码,顺便看下网络编程,不说太多,开始吧 第一步 设置wireshark过滤规则 tcp.port eq 81 ,然后开始捕捉 第二步 http://183.61.16.16 ...
- 欧拉图 CCF2016第六次 送货
// 欧拉图 CCF2016第六次 送货 // 思路: // CCF数据很水....这道题有问题 // 先判连通,再dfs边. // 应为输出要满足字典序最小,用vector存图,sort一遍,用st ...
- leetcode—3sum
1.题目描述 Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find ...
- C# 颜色转换
十六进制颜色与Color对象的互相转换[C#] C#十六进制颜色与Color对象的互相转换 把十六进制颜色转化为color对象ColorTranslator.FromHtml("#FF0 ...
- 一、python基础笔记(输入输出、list、touple、dict、set)
1.python 环境搭建 http://www.w3cschool.cc/python/python-install.html 2.python输入输出 print 'The quick brow ...
- HDU 5805 NanoApe Loves Sequence (模拟)
NanoApe Loves Sequence 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5805 Description NanoApe, the ...