一.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问题学习的更多相关文章

  1. python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie)

    python利用Trie(前缀树)实现搜索引擎中关键字输入提示(学习Hash Trie和Double-array Trie) 主要包括两部分内容:(1)利用python中的dict实现Trie:(2) ...

  2. java中File的delete()方法删除文件失败的原因

    java中File的delete()方法删除文件失败的原因 学习了:http://hujinfan.iteye.com/blog/1266387 的确是忘记关闭了: 引用原文膜拜一下: 一般来说 ja ...

  3. 数据库设计中的Soft Delete模式

    最近几天有点忙,所以我们今天来一篇短的,简单地介绍一下数据库设计中的一种模式——Soft Delete. 可以说,该模式毁誉参半,甚至有非常多的人认为该模式是一个Anti-Pattern.因此在本篇文 ...

  4. c++中new和delete的使用方法

    c++中new和delete的使用方法 new和delete运算符用于动态分配和撤销内存的运算符 new用法: 1.     开辟单变量地址空间 1)new int;  //开辟一个存放数组的存储空间 ...

  5. C++中的new/delete与operator new/operator delete

    new operator/delete operator就是new和delete操作符,而operator new/operator delete是函数. new operator(1)调用opera ...

  6. oracle中drop、delete和truncate的区别

    oracle中drop.delete和truncate的区别 oracle中可以使用drop.delete和truncate三个命令来删除数据库中的表,网上有许多文章和教程专门讲解了它们之间的异同,我 ...

  7. C++中的new/delete

    不同于C语言中的malloc/free是库函数,C++语言中的new/delete是运算符,而不是库函数. new/delete执行流程 我们经常会接触到的是new/delete operator(就 ...

  8. (原)关于MEPG-2中的TS流数据格式学习

    关于MEPG-2中的TS流数据格式学习 Author:lihaiping1603 原创:http://www.cnblogs.com/lihaiping/p/8572997.html 本文主要记录了, ...

  9. 数据库中drop、delete与truncate的区别

    数据库中drop.delete与truncate的区别 drop直接删掉表: truncate删除表中数据,再插入时自增长id又从1开始 :delete删除表中数据,可以加where字句. (1) D ...

随机推荐

  1. Android入门:发送HTTP的GET和POST请求

    HTTP的请求详解在我的博客中已经讲解过: http://blog.csdn.net/xiazdong/article/details/7215296 我在http://blog.csdn.net/x ...

  2. DateTime日期计算

    //今天 DateTime.Now.Date.ToShortDateString(); //昨天,就是今天的日期减一 DateTime.Now.AddDays(-1).ToShortDateStrin ...

  3. STL底层数据结构实现

    C++ STL 的实现: 1.vector      底层数据结构为数组 ,支持快速随机访问 2.list            底层数据结构为双向链表,支持快速增删 3.deque       底层 ...

  4. storm的安装配置

    一.安装Zookeeper 1.设置.profile文件: export ZOOKEEPER_HOME=/home/hadoop/streamdata/zookeeper-3.4.5-cdh4.5.0 ...

  5. Salt自动化之自动更新Gitfs-爱折腾技术网

    Salt自动化之自动更新Gitfs-爱折腾技术网 pygit2

  6. Java设计模式系列之迭代器模式

    迭代器模式定义 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 迭代器模式的角色构成 (1)迭代器角色(Iterator):定义遍历元素所需 ...

  7. Android实例-Delphi开发蓝牙官方实例解析(XE10+小米2+小米5)

    相关资料:1.http://blog.csdn.net/laorenshen/article/details/411498032.http://www.cnblogs.com/findumars/p/ ...

  8. 关于INTRAWEB ISAPI DLL发布

    怎样将Stand Alone App变为ISAPI Dll? 一是将工程文件中的program改成library,二是将uses里的IWInitStandAlone改成IWInitISAPI,没有该文 ...

  9. 如何设置(修改)jetty(maven插件maven-jetty-plugi)的端口

    在使用jetty的maven插件,有两种方式来改变jetty server的端口,第一种方式较为简单,即: 通过命令行指定端口:mvn -Djetty.port=9999 jetty:run 另一种方 ...

  10. HDU 1796How many integers can you find(简单容斥定理)

    How many integers can you find Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768 ...