C++中new与delete问题学习

一.new char与delete问题
1. 问题程序
[cpp] view plaincopy
#include <iostream>  

using namespace std;  

void main()  

{         

char* des = new char();  

des = "testing!";  

cout<<des<<endl;  

delete des;  //这个delete需要吗  

}  

2. 错误
       当运行到delete时,程序出错!

3. 解答
v1
你用new申请了一个char空间,把它的地址保存在了des这个指针里面
然后你又把"testing!"这个常量字符串的地址赋给了des这个指针
于是,你之前用new申请的那个空间就丢失了,在程序结束系统回收全部内存前,那个空间就被标明被你使用但实际上你已经丢失它的地址没办法再使用它了,这就是最常见的内存泄露
delete出错理所当然,因为你delete的不是你new的那个空间。甲被乙骗了钱不能去法院起诉丙,丙是无辜的 

v2
1.
char* des = new char();
应该只分配一个byte的空间,而后面的des = "testing!";我猜楼主的意图是要将"testing!"放入des所指向的空间,很显然实际上是放不下去的。之所以输出有没有问题,是刚好将"testing"的首地址给了des,这就改变des的值,也就是des = "testing!"中的des,和前面的char* des = new char();已经不同了。

4. 正确代码
V1
[cpp] view plaincopy
#include <iostream>  

using namespace std;  

void main()  

{  

       char* des = new char[10];  

       memset(des, 0, 10);  

       strcpy(des, "testing!");  

       cout << des << endl;  

       delete des;  

}  

V2 严格版

[cpp] view plaincopy
#include <iostream>  

using namespace std;  

void main()  

{  

    char* des = new char[10];  

    memset(des, 0, 10);  

    strcpy(des, "testing!");  

    cout << des << endl;  

    delete[] des; // new[]和delete[]对应。但由于char是基本数据类型,所以6楼那样写应该也是没有问题的  

}  

二.new int与delete
1. 程序
[cpp] view plaincopy
#include <iostream>  

using namespace std;  

void main()  

{  

//一维整型指针  

       int *a = new int [2];  

       for (int i=0;i<2;i++)  

       {  

              a[i] = 1;  

       }  

       for (int i=0;i<2;i++)  

       {  

              printf("%d \n",a[i]);  

       }  

       delete[] a;  

//二维整型指针  

       int **b = new int *[2];  

       for (int i=0;i<2;i++)  

       {  

              b[i] = new int [2];  

       }  

       for (int i=0;i<2;i++)  

       {  

              for (int j=0;j<2;j++)  

              {  

                     b[i][j] = 2;  

              }  

       }  

       for (int i=0;i<2;i++)  

       {  

              for (int j=0;j<2;j++)  

              {  

                     printf("%d ",b[i][j]);  

              }  

              printf("\n");  

       }  

       for (int i=0;i<2;i++)  

       {  

              delete[] b[i];  

       }  

       delete[] b;  

       system("pause");  

}  

2. 程序运行正常
       除char以外的基本数据类型,在进行指针释放时一般不用考虑太多,主要是因为没有字符串的赋值(实质是地址的赋值)。

三.小结
       在new的类型中,涉及到地址赋值,要千万小心!
四、使用陷阱
new和delete成对使用,避免内存泄露,申请内存数组时使用的"[]"而非“()”。如下:
char * szData=new char(100); (错误)
char *szData=new char[100];(正确)
    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;
    }
时间: 2024-08-29 09:06:42

C++中new与delete问题学习的相关文章

javascript delete机制学习

想了解delete的机制缘起一个现象,我无法解释,也无法理解. 首先看一下下面这个例子: ? 1 2 var x = 1; delete x; //false 然后我又执行了一次: ? 1 2 y = 2; delete y; //true 看到上面的结果,我比较吃惊,为什么同样是删除,区别怎么这么大呢?进而我想学习和了解一下JS delete的机制. 在MDN(Mozilla Developer Network)上看到下面一个例子 ? 1 2 3 4 5 6 7 8 9 10 11 12 13

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

new operator/delete operator就是new和delete操作符,而operator new/operator delete是函数. new operator(1)调用operator new分配足够的空间,并调用相关对象的构造函数(2)不可以被重载 operator new(1)只分配所要求的空间,不调用相关对象的构造函数.当无法满足所要求分配的空间时,则        ->如果有new_handler,则调用new_handler,否则        ->如果没要求不

数据库设计中的Soft Delete模式

最近几天有点忙,所以我们今天来一篇短的,简单地介绍一下数据库设计中的一种模式——Soft Delete. 可以说,该模式毁誉参半,甚至有非常多的人认为该模式是一个Anti-Pattern.因此在本篇文章中,我们不仅仅会对该模式进行介绍,同时也会列出该模式可能导致的一系列问题,以帮助大家正确地决定是否使用该模式. Soft Delete简介 首先先来想一个需求,那就是对用户操作的回滚支持.例如我现在正在用Word编写这篇文章.当我执行了一个错误操作的时候,我仅仅需要键入Ctrl + Z就可以进行回

SQL Server中的锁的简单学习

原文:SQL Server中的锁的简单学习 简介 在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但对于大多数数据库来说是需要同时处理多个查询的.这些查询并不会像绅士那样排队等待执行,而是会找最短的路径执行.因此,就像十字路口需要一个红绿灯那样,SQL Server也需要一个红绿灯来告诉查询:什么时候走,什么时候不可以走.这个红绿灯就是锁. 图1.查询可不会像绅士们那样按照次序进行排队 为什么需要

java学习中,匿名函数、构造方法、构造代码块、构造方法中调用构造方法(java 学习中的小记录)

java学习中,匿名函数.构造方法.构造代码块.构造方法中调用构造方法(java 学习中的小记录) 作者:王可利(Star·星星) 匿名函数 匿名对象:没有名字的对象 匿名对象使用的注意点: 1.一般不会用匿名对象给属性赋值,无法获取属性值,每次new 都是一个新的对象. 2.匿名对象永远都不可能是一个对象. 如:person new().name = "星星":是不行的 匿名对象的好处:书写简单. 匿名对象使用的场景: 1.如果一个对象调用一个方法一次的时候,就可以用匿名对象来调用.

contiki-main.c 中的process系列函数学习笔记 &lt;contiki学习笔记之六&gt;

说明:本文依然依赖于 contiki/platform/native/contiki-main.c 文件. ------------------------------------------------------------------------------------------------------------------------------------- 根据上一个笔记里面添加的printf()语句的打印信息提示,hello world 打印是在执行了 1 autostart_

spark中flatMap函数用法--spark学习(基础)

spark中flatMap函数用法--spark学习(基础) 在spark中map函数和flatMap函数是两个比较常用的函数.其中 map:对集合中每个元素进行操作. flatMap:对集合中每个元素进行操作然后再扁平化. 理解扁平化可以举个简单例子 val arr=sc.parallelize(Array(("A",1),("B",2),("C",3))) arr.flatmap(x=>(x._1+x._2)).foreach(prin

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

关于MEPG-2中的TS流数据格式学习 Author:lihaiping1603 原创:http://www.cnblogs.com/lihaiping/p/8572997.html 本文主要记录了,结合网上两篇博客 1) https://www.maizhiying.me/posts/2017/07/12/demux-ts.html 2) https://my.oschina.net/u/727148/blog/666824 ,mepg-2(13818)文档以及使用ffmpeg将mp4文件转码

关于linux操作系统中进程相关问题的学习笔记

关于linux操作系统中进程相关问题的学习笔记 1.摘要   进程的经典定义是一个执行中程序的实例.系统中的每个程序都运行在某个进程的上下文中(contest)中.上下文是由程序运行正确运行所需的状态组成的.这个状态包括存放在内存中的程序的代码和数据,它的栈.通用目的寄存器的内容.程序计数器.环境变量以及打开文件描述符合的集合.在本次学习笔记中,我是以linux为例,学习了以下三个方面的知识:操作系统如何组织进程.进程状态如何转换以及进程是如何调度的.在最后我还谈了下自己对操作系统进程模型的一些