首先,系统知道哪一部分堆的线性空间被占掉了,new就是起这个作用,仅仅是声明一下(可能多了一个功能),因为堆的空间不一定是直接从系统调用获得的,堆的空间是这样管理的:程序先伸请一个大的堆空间,这个时候是通过系统调用获得空间,以后的每一次new都是从这个已获得的空间里面再进行零售分配,与系统调用无关,只有当这个大的堆空间不足时,才会再次调用系统调用申请更多空间(new触发).所以,即使一个指针被delete掉,指针的值如果不变,他所指向的空间仍然在那一个大块空间里,仍然是属于进程的线性地址空间,估…
free()和delete()只是把指针所指向的内存释放掉,但是并没有把指针本身删除,也没有把指针置为NULL; #include<iostream> using namespace std; int main(void) { *sizeof(int)); strcpy(p,"Hello World"); cout<<"释放前指针p的地址:"<<&p<<endl; free(p); cout<<&q…
1.指针的初始化 指针初始化时,"="的右操作数必须为内存中数据的地址,不能够是变量,也不能够直接用整型地址值(可是int*p=0;除外,该语句表示指针为空).此时,*p仅仅是表示定义的是个指针变量,并没有间接取值的意思. 比如: int a = 25; int *ptr = &a; int b[10]; int *point = b; int *p = &b[0]; 假设:int  *p; *p = 7; 则编译器(vs2008)会提示The variable 'p'…
危险的代码: int* p=new int(1);   delete p;   delete p; 安全的代码: int* p=new int(1);   delete p;   p = NULL; (1)delete 一次以后,p成了野指针,它作为地址的值还是有效地没还可以访问它以前指向的内存,不过那片内存被重新格式化了:(2)p不等于NULL,用 if(p) 语句不能判断它指向的内存是否有效(此时它指向的内存无效,p本身有效):(3)delete 一次以后,不能再次delete,否则会报错:…
#include<iostream> using namespace std; class Object{ void* data; const int size; const char id; public: Object(int sz, char c) :size(sz),id(c){ data = new char[size]; cout << "Constructor Object" << id << ",size=&qu…
别看 free 和 delete 的名字恶狠狠的(尤其是 delete),它们只是把指针所指的内存给 释放掉,但并没有把指针本身干掉. 发现指针 p 被 free 以后其地址仍然不变(非 NULL),只是 该地址对应的内存是垃圾,p 成了“野指针”.如果此时不把 p 设置为 NULL,会让人误 以为 p 是个合法的指针. 如果程序比较长,我们有时记不住 p 所指的内存是否已经被释放,在继续使用 p 之 前,通常会用语句 if (p != NULL)进行防错处理.很遗憾,此时 if 语句起不到防错…
使用free或delete之后,只是把指针所指的内容给释放掉,但是指针并没有被干掉,还是指向原来位置(并不是执行NULL),此时指针指向的内容为垃圾,被称为“野指针”. 举例说明几个重要容易迷糊的特征: 1. 指针消亡了,并不表示他所指向的内存会被自动释放.例: void func(coid) { ); } 当函数执行完时,指针变量因为存在于栈上,会自动消亡.但是这不意味着分配的空间也会自动释放,原因是:动态非配的空间位于堆(动态内存分配区),必须自己去释放:否则,调用一次函数,造成一次内存泄露…
别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉. 用调试器跟踪示例7-5,发现指针p被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p成了“野指针”.如果此时不把p设置为NULL,会让人误以为p是个合法的指针. 如果程序比较长,我们有时记不住p所指的内存是否已经被释放,在继续使用p之前,通常会用语句if (p != NULL)进行防错处理.很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指…
先来一个观点.大家先看看对不对 按:在CSDN论坛上,有位坛友提到这个问题: ==================================== 先看一段代码: #include<stdio.h> void main() { int*p=10: printf("%d",p); } 看 看上述代码有什么问题没有?相信清楚指针概念的各位知道,int*p其实划分来看是(int*)p,他其实是一个指针,那么int*p=10:等价于 int*p:p=10:,大家都知道,指针就是…
如果把各种语言做个冷兵器类比的话,C语言一定是刀客的最佳工具.入门很简单,但是要是能把它熟练运用,那就是顶尖级别的高手了. 用了那么多年的C语言,发现自己还是仅仅处于熟练的操作工.今天遇到了一个bug,就是和指针的赋值有关系.请看代码: #include <stdio.h> ]; int main() { int *ptest = NULL; ptest = (*sizeof(int)); ptest[] = ; ptest[] = -; array = ptest; printf(],arr…
         Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda : 4.5.11    typesetting : Markdown   code """ @Author : 行初心 @Date : 18-10-1 @Blog : www.cnblogs.com/xingchuxin @Gitee : gitee.com/zhichengji…
1.void指针的类型转换 int A::functionCommamd(const DWORD _from,const DWORD _to,const DWORD Event_type,void * _data,void* _ret) { if (CMD_XXX_NUM==Event_type) { /*PropertiesPtr mProp= *(Properties::PropertiesPtr*)_data; std::string data = mProp->getValue("…
编程中有一种很难发现的错误是迷途指针.迷途指针也叫悬浮指针.失控指针,是党对一个指针进行delete操作后——这样会释放它所指向的内存——并没有把它设置为空时产生的.而后,如果你没有重新赋值就试图再次使用该指针,引起的结果是不可预料的. 空指针和迷途指针的区别? 当delete一个指针的时候,实际上仅是让编译器释放内存,但指针本身依然存在.这时它就是一个迷途指针. 当使用以下语句时,可以把迷途指针改为空指针: myPtr=0; 通常,如果在删除一个指针后又把它删除一次,程序就会变得非常不稳定,任…
首先,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…
指针类型的函数:函数的返回值是指针. 不要将非静态局部地址用作函数的返回值,离开函数后就失效了 在子函数中定义局部变量后将其地址返回给函数就是非法地址 在子函数中用new操作取得的内存地址返回给主函数合法有效,不会自动消失,必须用delete. 函数指针的用途——函数回调:将函数指针用作参数传递给另一个函数,例子如下 int compare (int a ,int b ,int (*fun)(int,int)) {return fun(a,b);} int max(int a, int b) {…
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…
delete p后,只是释放了指针中存放的地址中的内存空间.但是指针变量p仍然存在(即指针p本身所占有的内存),且p中存放的地址还是原来的地址. 例如: 对一个非空指针delete后,若没有将p赋为NULL,若再次delete的话,会出现问题. 如下代码: #include <iostream> int main() { ); delete p; delete p; ; } 在ubuntu14.04中使用g++进行编译无问题,但运行时报错如下: 意思就是对同一指针变量进行了两次释放内存的操作,…
C++ 类对象和 指针的区别 C++ 类对象和 指针的区别 转自:http://blog.csdn.net/ym19860303/article/details/8557746 指针的情况 class Test{ public: int a; Test(){ a = ; } }; int main() { Test* t1 = new Test(); t1->a = ; Test* t2 = new Test(); t2->a = ; cout << "&t1:&…
1.1.空指针 如果 p 是一个指针变量,则 p = 0; p = 0L; p = '\0'; p = 3 - 3; p = 0 * 17;p=(void*)0; 中的任何一种赋值操作之后, p 都成为一个空指针,由系统保证空指针不指向任何实际的对象或者函数.反过来说,任何对象或者函数的地址都不可能是空指针.(比如这里的(void*)0就是一个空指针.把它理解为null pointer还是null pointer constant会有微秒的不同,当然也不是紧要了).其实空指针只是一种编程概念,就…
指针是C/C++编程中的重要概念之一,也是最容易产生困惑并导致程序出错的问题之一.利用指针编程可以表示各种数据结构,通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯:指针能够灵活的操作内存,合理的操作内存能够使程序更高效. 1.指针的概念 本质上讲指针也是一种变量,普通的变量包含的是实际的数据,而指针变量包含的是内存中的一块地址,这块地址指向某个变量或者函数,指针就是地址.指针是一个指示器,它告诉程序在内存的哪块区域可以找到数据. 2.指针的内容 指针的内容包含4部分…
<C++ Primer 4th>读书摘要 与 vector 类型相似,数组也可以保存某种类型的一组对象:而它们的区别在于,数组的长度是固定的.数组一经创建,就不允许添加新的元素.指针则可以像迭代器一样用于遍历和检查数组中的元素.设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针. 此常量表达式只能包含整型字面值常量.枚举常量或者用常量表达式初始化的整型 const 对象.非 const 变量以及要到运行阶段才知道其值的const变量都不能用于定义数组的维数. 如果没有显式提供元素初值…
转载自:http://blog.csdn.net/shihui512/article/details/9787125 什么是函数指针函数指针的声明函数指针的赋值函数指针的使用将函数作为其他函数的参数在C类中使用函数指针typedef 返回类型类名新类型参数表函数指针的应用用指向函数的指针作函数参数函数指针与指针函数的区别函数指针与typedef函数指针与动态绑定其他 什么是函数指针 就像某一变量的地址可以存储在相应的指针变量中一样,指向函数的指针中保存着函数代码起始处的地址 函数指针的声明 当声…
在C++学习使用过程中,每个人都不可避免地使用指针,而且都或多或少的接触过常量指针或指针常量,但是对这两个的概念还是很容易搞糊涂的. 本文即是简单描述指针常量和常量指针的区别. 常量指针 定义: 又叫常指针,可以理解为常量的指针,也即这个是指针,但指向的是个常量,这个常量是指针的值(地址),而不是地址指向的值. 关键点: 1.常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改:          2.常量指针可以被赋值为变量的地址,之所以叫常量指针,是限制了通过这个指针修改…
作者:rendao.org,版权声明,转载必须征得同意. 内存越界,变量被篡改 memset时长度参数超出了数组长度,但memset当时并不会报错,而是操作了不应该操作的内存,导致变量被无端篡改 还可能导致内存越界的函数有memset.memcpy.memmove.strcpy.strncpy.strcat.sprintf等等 临时指针问题,std::string.wstring的c_str()是个临时指针 c_str()返回值是个char*/wchar_t*指针,这个数组的数据是临时的,当有一…
转载于http://blog.csdn.net/hinyunsin/article/details/6662851     前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情,一直没有时间静下心来写这些东西,毕竟这确实是一件非常耗费时间和精力的事情:一方面,个人对C语言的掌握和理解也还有限,怕写出来的东西会对大家造成误导.当然,今天写的这些东西也肯…
指针是C/C++编程中的重要概念之一,也是最容易产生困惑并导致程序出错的问题之一.利用指针编程可以表示各种数据结构,通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯:指针能够灵活的操作内存,合理的操作内存能够使程序更高效. 1.指针的概念 本质上讲指针也是一种变量,普通的变量包含的是实际的数据,而指针变量包含的是内存中的一块地址,这块地址指向某个变量或者函数,指针就是地址.指针是一个指示器,它告诉程序在内存的哪块区域可以找到数据. 2.指针的内容 指针的内容包含4部分…
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 =…
转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7561235 智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露.它的一种通用实现技术是使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针.每次创建类的新对象时,初始化指针并将引用计数置为1:当对象作…
理解delete 理论 代码段的类型 执行上下文 活动对象 / 变量对象 属性的特性 内置属性与 DontDelete 未声明的赋值 Firebug的困惑 在eval中删除变量 浏览器兼容性 Gecko的DontDelete bug IE bugs 误解 'delete' 和 宿主对象 ES5严格模式 总结 几个礼拜前, 我有了个机会去翻阅Stoyan Stefanov的 Object-Oriented Javascript 一书. 这本书在亚马逊上拥有很高的评价(12篇评论, 5颗星), 所以…
前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情,一直没有时间静下心来写这些东西,毕竟这确实是一件非常耗费时间和精力的事情:一方面,个人对C语言的掌握和理解也还有限,怕写出来的东西会对大家造成误导.当然,今天写的这些东西也肯定存在各种问题,不严谨甚至错误的地方肯定有,也希望大家来共同探讨,相互改进. 我会慢慢的写完这几章,有想法的童鞋可以和我探讨…