delete 指针】的更多相关文章

#include<iostream>using namespace std;class human{public: human(){cout<<"构造";} int can(){x=4; return x;}private: int x;};int main(){(1) human *p=new human; (2)delete p; (3)p=0; (4)delete p; (5)p=new human; return 0;}第(2)释放了指针所指向的内存空间…
delete p后,只是释放了指针中存放的地址中的内存空间.但是指针变量p仍然存在(即指针p本身所占有的内存),且p中存放的地址还是原来的地址. 例如: 对一个非空指针delete后,若没有将p赋为NULL,若再次delete的话,会出现问题. 如下代码: #include <iostream> int main() { ); delete p; delete p; ; } 在ubuntu14.04中使用g++进行编译无问题,但运行时报错如下: 意思就是对同一指针变量进行了两次释放内存的操作,…
C++标准规定:delete空指针是合法的,没有副作用. 所以我们在Delete指针后赋值为NULL或0是个好习惯.对一个非空指针delete后,若没有赋NULL,若再次delete的话 有可能出现问题.如下代码: 可以看出delete是释放指针指向的内存,并不是指针本身所占有的内存.所以delete后,指针的还是指向那块区域,并 未清0,所以如果下次用到,就会发生xxx空间不能访问的异常. 以后delete后要赋值为空…
首先,C++标准规定:delete空指针是合法的,没有副作用.但是,delete p后,只是释放了指针指向的内存空间.p并不会自动被置为NULL,而且指针还在,同时还指向了之前的地址. 问题来了,对一个非空指针delete后,若没有赋NULL,若再次delete的话,有可能出现问题.如下代码 int *p = new int(3); delete p; delete p; 用VC编译运行将出现问题.将其改为: int *p = new int(3); delete p; p = NULL; de…
int *p;/*........*/delete p; p=null; 看代码的过程中,有这么一个疑问.删除了指针p,指针p既是不存在,怎么还能设置指针p为null呢?为什么还要设置为null呢? 后来得知计算机上删除数据的方式:删除数据(视频,音乐,文件等),计算机并不会把存储数据的硬盘区域(或者是内存)的内容擦除消去,而是将内容标记为可覆盖,这时候我们就不能再访问到数据,而这些可覆盖据数据会留在原来的硬盘区域直到被新的数据逐渐覆盖.(所以,删除了数据之后,只要没有对硬盘进行过多的操作,还是…
delete p后,只是释放了指针指向的内存空间.p并不会自动被置为NULL,而且指针还在,同时还指向了之前的地址 delete NULL编译器不会报错(因为delete空指针是合法的) 例: 对一个非空指针delete后,若没有赋NULL,若再次delete的话,有可能出现问题. 如下代码 int *p = new int(3); delete p; delete p; 用VC编译运行将出现问题. 将其改为: int *p = new int(3); delete p; p = NULL; d…
是释放指针所指向的内存,而不是删除指针本身…
1.现象 经常看到有些代码在delete之后赋值为null 2.原因 C++标准规定:delete空指针是合法的,没有副作用. 所以我们在Delete指针后赋值为NULL或0是个好习惯.对一个非空指针delete后,若没有赋NULL,若再次delete的话,会报错…
小结: 1.栈内存 为什么快? Due to this nature, the process of storing and retrieving data from the stack is very fast as there is no lookup required, you just store and retrieve data from the topmost block on it. 堆内存 慢于栈内存 ,但存储空间动态,使用指针访问 Heap is used for dynam…
学过c语言的人都知道,c语言中动态分配内存空间使用的是库函数malloc,calloc,realloc以及free.而c++中所使用的是关键字new和delete.如 动态分配 new  ,  撤销内存  delete new int; //开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针) ); //开辟一个人存放整数的空间,并指定初值为100,返回一个指向该存储空间的地址 ]; //包括10个元素的空间,返回首元素的地址 float *p = new float(3.1415…
指针主要分: 指向单一的某个对象/变量, 用于多态或函数指针, 这个不难 - 一级指针 其次是指向数组, 用来操作/遍历数组元素 - 一级/二级指针 指向数组的一级指针很简单了: p指向的是数组的元素, p++是指向下一个元素值, *p返回数组元素的值 二级指针也不难吧, 你只要想到: p指向的是指针, p++指向的是下一个指针, **p才能得到具体的值. 二级指针主要用在: 1 改变数组中局部变量指针, 移动局部指针;int **pp =&p; int *p=&arr; 2 二维字符串数…
作者:rendao.org,版权声明,转载必须征得同意. 内存越界,变量被篡改 memset时长度参数超出了数组长度,但memset当时并不会报错,而是操作了不应该操作的内存,导致变量被无端篡改 还可能导致内存越界的函数有memset.memcpy.memmove.strcpy.strncpy.strcat.sprintf等等 临时指针问题,std::string.wstring的c_str()是个临时指针 c_str()返回值是个char*/wchar_t*指针,这个数组的数据是临时的,当有一…
shared_ptr和new结合使用 一个shared_ptr默认初始化为一个空指针.我们也可以使用new返回的指针来初始化一个shared_ptr: shared_ptr<double> p1; shared_ptr<int> p2(new int(42)); // p2指向一个值为42的int 接受指针参数的智能指针构造函数是explicit的,因此,我们不能将一个内置指针隐式的转换为一个智能指针,必须使用直接初始化形式: shared_ptr<int> p1 =…
今天一直在学习函数定义之类的问题,下午正好有机会和大家共享一下. 一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个字节. 声明方法:bool result;result=true; 可以当作整数用(true一般为1,false为0) 把其它类型的值转换为布尔值时,非零值转换为true,零值转换为false,注意会产生截断. 二.const 限定符 (1).用const给字面常量起个名字(标识符),这个…
malloc/free是C语言中的内存申请和释放函数,利用它们可方便地管理内存.而在C++中我们又有了新的工具:new/delete.new/delete在管理内存的同时会调用类的构造函数和析构函数,而malloc/free仅仅实现了内存的分配和释放,没有调用类的构造函数和析构函数. malloc/free是C/C++语言的标准库函数,而new/delete是C++语言的运算符关键字.由于malloc/free是C/C++语言的标准库函数,所以在使用时需要头文件库函数支持.对于非内置数据类型,用…
Date:2014-1-5 Summary: C++中的动态内存创建与释放(这里就只记录C++中的new和delete了,其他的C风格操作就略过了) 单独记录new和delete的原因是为了学习时候关注点更清晰 Contents:1.new操作符 new操作符的作用是:找到一块长度正确的内存块,把该内存块的地址返回(所以我们需要一个指针用于接收new返回的内存地址,以便之后我们对该内存空间进行访问) 2.delete操作符 delete操作符的作用是:释放动new操作符创建出来的内存空间 a).…
1. 数组 1.1 数组作为函数参数 (1) 如果使用数组作为函数的参数,则实参和形参都是数组名,且类型要相同.数组名做参数时传递的是地址 (2) 使用方法: void rowSum(int a[][4], int n, int m); // 不能写成 int a[][];也不能写成int **a; 1.2 对象数组 (1) 声明语句 ① 类名 数组名[常量表达式]; (2) 例子: Location a[2] = {Location(1,2), Location(3,4)}; Location…
在学习C++或者是C语言时难免会动态分配内存,这时你便要使用到指针.这里以C++为例,讲一下使用指针的注意事项: 比如说,Dog dog = new Dog(),这么一句语句系统就会为你分配内存.当然,在你使用完时,你一定要记得要进行delete操作. 要知道new 和 delete 本是一对. 在C++中规定delete 空指针是合法的,没有副作用.所以,在delete指针后,将指针赋为NULL是个好习惯.对于一个非空指针delete后,如果没有赋值为NULL,若再次delete的话,可能会出…
一:纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都定义自己的版本 纯虚函数为各个派生类提供一个公共接口 纯虚函数的形式: virtual 类型 函数名(参数列表)=0: 一个具有纯虚函数的基类称为抽象类 注意:抽象类不能实例化对象 一个派生类继承抽象类但是未实现纯虚函数,则也变为抽象类,可以继续被继承实现 class Parent //抽象类 { public: Parent() { cout << "Parent construct&quo…
1.新的标准库提供了两种智能指针类型,shared_ptr允许多个指针指向同一个对象,unique_ptr则独占所指的对象.标准库还定义了一个名为weak_ptr的伴随类,它是一种弱引用,指向shared_ptr所管理的对象. 2.智能指针也是模板,默认初始化的智能指针中保存着一个空指针. 3.智能指针的操作: 4.make_shared用参数来构造指定类型的对象. std::shared_ptr<int> p = std::make_shared<int>(42); // 指向一…
一.new和delete基本用法 程序开发中内存的动态分配与管理永远是一个让C++开发者头痛的问题,在C中,一般是通过malloc和free来进行内存分配和回收的,在C++中,new和delete已经完全包含malloc和free的功能,并且更强大.方便.安全. new一般用法: new 类型 (初值) 用new分配数组空间时不能指定初值. delete一般用法: delete [] 指针变量 []部分是可选的,当释放数组所占内存时必须加[].当你对一个指针使用 delete,delete 知道…
#include <iostream> using namespace std; void main() { //用new创建一个二维数组,有两种方法,是等价的 //一: ] = ][]; //二: ]; ;i <;i++) p[i] = ]; //指针数组的创建,也有两种方法 //一: ]; ;i <;i++) { pa[i] = ]; //为每个指针都分配8个char元素空间. } //二: ];//可以不用new创建 ;i <;i++) { pa[i] = ]; //为…
1.new new操作针对数据类型的处理,分为两种情况: (1)简单数据类型(包括基本数据类型和不需要构造函数的类型) 代码实例: int* p = new int; 汇编码如下: int* p = new int; 00E54C44 push 4 00E54C46 call operator new (0E51384h) 00E54C4B add esp,4 分析:传入4byte的参数后调用operator new.其源码如下: void *__CRTDECL operator new(siz…
在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除.在C语言中是利用库函数malloc和free来分配和撤销内存空间的.C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数. 注意: new和delete是运算符,不是函数,因此执行效率高. 虽然为了与C语言兼容,C++仍保留malloc和free函数,但建议用户不用malloc和free函数,而用new和delete运算符.new运算符的例子: new int;  //开辟一…
主要内容: 1.  C语言中的函数malloc和free 2.  C++中的运算符new和delete 3.  new/delete与malloc/free之间的联系和区别 4.  C/C++程序的内存分配介绍 详细介绍: C语言的函数malloc和free (1) 函数malloc和free在头文件<stdlib.h>中的原型及参数 void * malloc(size_t size) 动态配置内存,大小有size决定,返回值成功时为任意类型指针,失败时为NULL. void free(vo…
一.new的浅析 在C++中,new主要由三种形式:new operator.operator new和placement new • new operator new operator即一些C++书籍中(如<C++ Primer>)所说的new表达式(new expression) ,也是我们在C++中用来进行动态内存空间开辟的主要工具. 语法: 语法1:类型* 指针名=new 类型 //在内存的堆区动态开辟一个变量大小的空间 语法2:类型* 指针名=new 类型(初始化值) //在内存的堆…
一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个字节. 声明方式:bool result; result=true; 可以当作整数用(true一般为1,false为0) 把其它类型的值转换为布尔值时,非零值转换为true,零值转换为false,注意会发生截断. 二.const 限定符 (1).用const给字面常量起个名字(标识符),这个标识符就称为标识符常量:因为标识符常量的声明和使用形式很像变量,…
//new delete操作符 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; /* 1.new delete 操作符号 都是 c++的关键字 类似于 C语言中的 malloc()函数 free()函数 2.定义对象时,使用了new关键字,会为这个对象在堆上分配内存,不使用new 关键字会直接在栈上分配内存 new 关键字可以分配基础类型内存,数组类型内存,对象类型内存 对于基础类型内存和数组类型内…
背景: 数组的长度是定义好的,在整个程序中固定不变.c++不允许定义元素个数不确定的数组.例如: int n; int a[n]; //这种定义是不允许的 但是在实际编程中,往往会出现要处理的数据数量在编程时无法确定的情况.如果总是定义一个尽可能大的数组,又会造成空间浪费.何况,这个“尽可能大”到底应该多大才够呢? 为了解决这个问题,c++提供了一种“动态分配内存”的机制,使得程序可以在运行期间,根据实际需要,要求操作系统临时分配一片内存空间用于存放数据.这种内存分配是在程序运行中进行的,而不是…
update 2014-05-17 一.位运算 应用: 1.判断某一位是否为1 2.只改变其中某一位,而保持其它位都不变 位运算操作: 1.& 按位与(双目): 将某变量中的某些位(与0位与)且同时保留其它位不变(与1位与):获取某变量中某一位(与其位与后判断是否为该数) 2.|  按位或(双目): 将某变量中的某些位(与1位或)且保留其它位不变 3.^  按位异或(双目): 将某变量中的某些位异或)且保留其它位不变 与0异或保持不变,与1异或相当于取反: 与自身异或为0: 满足交换律,具有逆运…