相关文章推荐
寂寞的茶叶  ·  ios iframe ...·  1 月前    · 
好帅的沙发  ·  C# ...·  6 月前    · 
比如 int* p = new int(1); delete p; 就会在堆上分配一块内存,当作int类型使用,并赋值为1,将其地址储存在栈上的int*类型的p里。delete p会释放p所指向的内存。而这里p为一自动变量,其本身在程序退出其作用域时销毁。 用delete命令处理某个指针,说是把那个指针删除了是不正确的。 delete命令指示释放了那个指针原本所指的那部分内存而已。被delete后的指针p的值(地址值)并非就是NULL,而是随机值。 也就是被delete后,如果不再加上一句p=NULL,p就成了“野指针”,在内存里乱指一通。 如果在定义p的那个函数在delete了p后,没再调用p,就没什么问题,在这个函数结束后,p就会跟其它变量一样被消除。但若在那个函数里delete了p后,又没再给p赋值(地址值),再次调用p就危险了,因为这时p在内存里乱指,有可能指到一些重要地址,随时可能系统崩溃。 //p=NULL是个好习惯 //就像你蹲完厕所要洗手一样 《问题》危险的代码: int* p=new int(1); delete p; delete p; 连续两次对同一个指针delete ,会造成严重的错误。编译器会检测出这样的错误吗?或许一些编译器会的,但别太过指望编译器。 第一次delete后,p自动为空(NULL)了吗?不是的。 在delete之前会自动检查p是否为空(NULL),如果为空(NULL)就不再delete了吗?确实是如此。 删除为空(NULL)的指针是不会有任何问题的吗?确实是如此。 #define SAFE_DELETE(p) delete (p); p = 0; 这样就就万事大吉了吗?好像不是的。 delete p+1;//在C++中是正确的 SAFE_DELETE(p+1)将会导致错误 没有好的方法解决重复释放这样的问题,只能靠程序员的细心了。 《结论》安全的代码: int* p=new int(1); delete p; p = NULL; (1)delete 一次以后,p成了野指针,它作为地址的值还是有效地没还可以访问它以前指向的内存,不过那片内存被重新格式化了; (2)p不等于NULL,用 if(p) 语句不能判断它指向的内存是否有效(此时它指向的内存无效,p本身有效); (3)delete 一次以后,不能再次delete,否则会报错; (4)此时如果误用p指针,仍然可以修改内存的值和从该处取出数值,但此时数据不受保护,该内存空间可能被重新被分配给别的变量; (5)如果p指向的空间再次被new函数分配,即使是分配给别的指针,即使分配大小与原来不一样,p又恢复了效力,可以改变内存的值,甚至可以重新被delete,p的作用与新分配的指针一样; 1.假如你不去释放,那么该区域的内存始终不能被其他数据所使用。 2. 指向 该内存的 指针 是个局部 变量 ,当定义给 指针 的函数结束并返回时, 指针 也就消失了,那么就再也找不到该块的内存区域。 假如 指向 该内存区域的 指针 自动消失了,计算机就再也找不到该区域的内存了,就好像丢了这块内存一样,这 种情况称为“内存
p所指的 空间 。比如 int* p = new int(1); delete p;就会在堆上分配一块内存,当作int类型使用,并赋值为1,将其地址储存在栈上的int*类型的p里。 delete p会释放p所 指向 的内存。而这里p为一自动 变量 ,其本身在程序退出其作用域时销毁。 用 delete 命令处理某个 指针 ,说是把那个 指针 删除 了是不正确的。 delete 命令指示释放了那个 指针 原本所指的那 部分 内存而已。被...
delete p; 之后, 指针 指向 的内存 空间 已经释放了,该 指针 已经没有“实权”了,但是该 指针 还是存在,并没有消失,而且 指向 的地址也没有改变,这时对这个 指针 的任何操作都是危险的,很容易发生程序错误,这时候的p就是一个野 指针 ,比如再次执行 delete p操作,会使程序崩溃。良好的习惯是在 delete 之后,随后将该 指针 置NULL,如下: int *p = new int(1); delete p; p = NULL; 这时候发生 delete p操
C++标准规定: delete 指针 是合法的,没有副作用。所以我们一般在 delete 后就以为万事大吉了,其实这是不安全的。 我们在 Delete 指针 后赋值为NULL或0是个好习惯。对一个非空 指针 delete 后,若没有赋NULL,若再次 delete 的话 有可能出现问题。如下代码: 可以看出 delete 是释放 指针 指向 的内存,并不是 指针 本身所占有的内存。所以 delete 后, 指针
删除 指针 并不意味着这个 指针 就不存在了,只有在函数结束后,这个 指针 才会消失 delete ptr;的作用是释放了 指针 原来 指向 的内存,此时的 指针 指向 为随机的,称为野 指针 如果野 指针 指向 系统中重要的内存地址,再次调用该 指针 的时候就可能导致系统崩溃 所以 删除 指针 后,要将相应的 指针 赋值为 nullptr 传递给 delete 指针 必须 指向 动态分配的内存,或者是一个空 指针 delete 一块并非new的内存,或将相同的 指针 值释放多次,其行为是未定义的。 编译器不能分辨一个 指针 指向 的对象是静态还是动态分配的。 编译器也不能分辨一个 指针 指向 的内存是否已经释放。 delete 一个已经 delete 指针 ,为什么有时候会报错有时候不会?一个 指针 delete 后是什么状态? reference1:使用 delete 删除 指针 (转) - romanten - 博客园 (c