free和delete把指针怎么啦?

别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。

用调试器跟踪示例7-5,发现指针p被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p成了“野指针”。如果此时不把p设置为NULL,会让人误以为p是个合法的指针。

如果程序比较长,我们有时记不住p所指的内存是否已经被释放,在继续使用p之前,通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。

char *p = (char *) malloc(100);
    strcpy(p, “hello”);
    free(p);        // p 所指的内存被释放,但是p所指的地址仍然不变
    …
    if(p != NULL)    // 没有起到防错作用
    {
       strcpy(p, “world”);    // 出错
}

free和delete把指针怎么啦?

时间: 2024-10-05 22:13:32

free和delete把指针怎么啦?的相关文章

free 或delete后指针怎么样了

free()和delete()只是把指针所指向的内存释放掉,但是并没有把指针本身删除,也没有把指针置为NULL; #include<iostream> using namespace std; int main(void) { char *p=(char *)malloc(100*sizeof(int)); strcpy(p,"Hello World"); cout<<"释放前指针p的地址:"<<&p<<end

使用delete删除指针(转)

p所指的空间.比如 int* p = new int(1);delete p;就会在堆上分配一块内存,当作int类型使用,并赋值为1,将其地址储存在栈上的int*类型的p里.delete p会释放p所指向的内存.而这里p为一自动变量,其本身在程序退出其作用域时销毁. 用delete命令处理某个指针,说是把那个指针删除了是不正确的. delete命令指示释放了那个指针原本所指的那部分内存而已.被delete后的指针p的值(地址值)并非就是NULL,而是随机值. 也就是被delete后,如果不再加上

智能指针简介

智能指针用于解决常规指针所带来的内存泄露.重复释放.野指针等内存问题.智能指针基于这样的事实得以发挥作用:定义在栈中的智能指针,当超出其作用域时,会自动调用它的析构函数,从而可以释放其关联的内存资源. 之前C++标准库中定义的智能指针std::auto_ptr<T>,因其设计存在缺陷,所以已不再推荐使用.C++11引入了新的智能指针:unique_ptr.shared_ptr和weak_ptr. 一:unique_ptr unique_ptr类似于auto_ptr.两个unique_ptr实例

关于new delete的说明

1. 删除空指针不会有问题,因为C++的标准规定在delete时首先会判断指针是否为空,为空就不再处理,所以也就不会有问题. 2. delete一个非空指针之后,并不会将该指针自动置为空.此时如果重复删除或继续访问会出现问题. 3. 从上面的两个特性,我们在delete完一个指针之后,要马上将其置为空,防止重复delete出现问题. 4. 我们在delete一个指针之前不需要检测指针是否为空,因为delete空指针也是没问题的. 5. 我们在引用一个未知的指针时,要判断一下这个指针是否为空. 6

More Effective C++ 条款28 Smart Pointers(智能指针)

1. 智能指针(如标准库的auto_ptr,shared_ptr,weak_ptr,boost的scoped_ptr等)主要用于动态内存的管理,同时提供给用户与内置指针一样的使用方法,本条款主要涉及智能指针在构造与析构,复制和赋值,解引等方面的注意点,而非智能指针的实现细节. 2. 智能指针的构造,赋值,析构 智能指针的copy constructor,assignment operator,destructor对应于不同的观念而有不同的实现,主要有三种选择: 1).不允许对象的共享,在调用co

关于空指针NULL、野指针、通用指针

http://www.cnblogs.com/losesea/archive/2012/11/16/2772590.html 首先说一下什么是指针,只要明白了指针的含义,你就明白null的含义了.假设 有语句 int a=10;那么编译器就在内存中开辟1个整型单元存放变量a,我们假设这个整型单元在内存中的地址是 0x1000:那么内存0x1000单元中存放了数据10,每次我们访问a的时候,实际上都是访问的0x1000单元中的10.现在定义:int *p:                 p=&a

[转]C++中关于new和delete的使用

转载的地址 近一直在啃 C++ Primer 中文版第4版,发现 C++中new和delete应用遍布全书,现对其使用作简单总结.在C++中,可以使用new和delete动态创建和释放数组或者单个对象,现在对它们的使用一一道来. 1.创建动态数组 数组类型的变量有三个重要的限制:数组长度固定不变,在编译时必须知道它的长度,数组只在定义它的块语句中存在.对于动态分配的数组,虽然长度是固定的,但是动态分配的数组不必在编译时知道其长度,可以(通常也是)在运行时才确定数组长度:同时,动态分配的数组一直存

《21天学会C++》第8章阐述指针学习笔记

1.C++一个强大而低级的工具是,可以使用指针来直接操纵计算机内存,这也是C++相对于JAVA.C#和Visual Basic等语言的优点之一. 2.什么是指针?指针是存储内存地址的变量. 3.能够使用指针以及在底层操纵内存是C++被选择用于编写嵌入式和实时应用程序的原因之一. 4.指针定义的时候一定要初始化,没有被初始化的指针被称为失控指针,是很危险的. int *pAge=0; pAge被初始化为0,值为0的指针被称为空指针. 5.指针和数组名:在C++中,数组名是一个常量指针,指向数组的第

Vector成员为指针时要注意的问题

vector的复制是浅复制,所以复制一个包含动态内存的变量的对象的话就会出问题. 解决办法:自己写类的复制构造函数,为新对象的指针开辟新的内存空间. 但当vector离开作用域之后,只会把其成员所占的内存删除(即指针),而不会删除指针指向的内存,就会出现内存泄露. 解决办法:使用智能指针. 1 #include <iostream> 2 #include <memory> 3 #include <vector> 4 using namespace std; 5 6 cl