社区
C++ 语言
帖子详情
在C++中,能不能delete空指针?
BlueprintIrene
2004-07-06 11:53:49
有如下程序:
char *p = NULL;
delete p;
请问以上程序运行会有问题吗?
...全文
5077
41
打赏
收藏
在C++中,能不能delete空指针?
有如下程序: char *p = NULL; delete p; 请问以上程序运行会有问题吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
41 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
潜水8年再度回归
2004-07-09
打赏
举报
回复
标准C++规定,delete空指针是完全合法的,不会引发任何问题。
jumpandfly
2004-07-09
打赏
举报
回复
delete p; p = 0;
第二句重要了,不然p会成野指针,乱指一气,因为delete p 只是释放p先前所指的内存,但释放以后,由于没有给p赋空,那么它还可能乱指
唉,c++忘得差不多了,就记得这一点了,还不知道记错没有:)
---------------------------------------------------------------------
太对了,不过既使是在好多大师的书中,也建议先判断是不是空指针,然后再delete
ljh518
2004-07-08
打赏
举报
回复
如果指针操作数被设置为0,则C++会保证delete 表达式不会调用操作符delete();
在delete指针之前,也没有必要测试其是否为0,实际上在多数实现下如果增加了指针的显式测试那么该测试实际上会被执行两次。
可以结题啦
alexwhu
2004-07-07
打赏
举报
回复
char *p = new char;
delete p;
delete p; // 不能删除两次
最好的风格是:
if(pMyClass) //这里, pMyClass是指向某个类的指针 . .
{
delete pMyClass ;
pMyClass = NULL; // 这句不能少
}
因为这段代码在一个函数中,避免函数被调用两次而引起问题
指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
×××××××××××××××××××××
学了很多东西,其实delete后再滞空,意思是防止这个指针再次北delete
bravemanman
2004-07-07
打赏
举报
回复
delete p; p = 0;
第二句重要了,不然p会成野指针,乱指一气,因为delete p 只是释放p先前所指的内存,但释放以后,由于没有给p赋空,那么它还可能乱指
唉,c++忘得差不多了,就记得这一点了,还不知道记错没有:)
xmashuang
2004-07-07
打赏
举报
回复
按照标准的规定是可以的,但是各个编译器实现上各有不同,不建议这样使用,还是严格实行分配--〉使用--〉释放的过程比较好。
bjskyhorse
2004-07-07
打赏
举报
回复
有同志认为删除后把指针置空多余.其实看看<<高质量C++编程>>的说法:
7.7 杜绝“野指针”
“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。
“野指针”的成因主要有两种:
(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如
char *p = NULL;
char *str = (char *) malloc(100);
(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
hwman
2004-07-07
打赏
举报
回复
没事就 delete 玩,多做几次有益无害
QunKangLi
2004-07-07
打赏
举报
回复
C++标准明文规定,那是合法的!
menubutton
2004-07-07
打赏
举报
回复
说的都没错,不管判断与否,但申请了内存空间,用完时就必须要释放是重要的,也是好的习惯!
antijpn
2004-07-07
打赏
举报
回复
delete就是了,没关系,不会有问题的,C++里面自己检查是不是空指针,如果不是空,那么就delete,如果是空,那么就不进行delete
不过delete最大的问题是不会自动把指针设置为NULL,记不得是在什么地方看到的,说是要重载delete操作符解决问题(谁还记得在哪本书上出现过这个意思啊?)
baojian88888
2004-07-07
打赏
举报
回复
4. delete pMyClass;
pMyClass = 0;
这样写也可以,加上一个判断也许可以提高少许的效率
baojian88888
2004-07-07
打赏
举报
回复
1. delete NULL 是没有问题的
2. char *p = new char;
delete p;
delete p; // 不能删除两次
3. 最好的风格是:
if(pMyClass) //这里, pMyClass是指向某个类的指针 . .
{
delete pMyClass ;
pMyClass = NULL; // 这句不能少
}
因为这段代码在一个函数中,避免函数被调用两次而引起问题
hszr99
2004-07-07
打赏
举报
回复
ok
郑再鹏
2004-07-07
打赏
举报
回复
if (NULL != ptr)
{
delete ptr;
ptr = NULL;
}
最安全。
Mephisto_76
2004-07-07
打赏
举报
回复
我一般的用
if(p)
{
delete p;
p = 0;
}
但是不判断也是可以的。
sunjx119
2004-07-07
打赏
举报
回复
可以的
也是有意义的!
对程序的通用化很有好处
就是说你new了个指针最后总得释放吧
一般大家还要判断一下到底这个指针是否有内容,如果没有就不用释放了;
可是如果我delete 0是没问题的,那么不管这个指针到底怎么样我都可以统统以一种模式处理了,就是:new -> ... ->delete,方便!高效!
JM0624
2004-07-07
打赏
举报
回复
绝对没有问题!
不过好像没有什么实在意义!
Jinhao
2004-07-06
打赏
举报
回复
delete 空指针是一个很有用的东东
CrazyFormat
2004-07-06
打赏
举报
回复
同意!
加载更多回复(21)
C++
智能指针实现(不用再担心你的内存泄露)
代码量,2.5KB,指针共享操作,自动在最后一个智能指针销毁时
delete
,不再产生内存泄露。内含简单使用范例。不支持管理数组。设有Debug版本的断言,确保智能
空指针
不被使用。 /* 智能指针类
不能
用于数组,指针指向的数据必须是new出来的
不能
创造该类的指针
不能
将任意实体指针分别赋值给两个不同的智能指针(通过构造函数或者=) */
17~
C++
new和
delete
运算符重载
重载 class A的new/
delete
以及 new[]/
delete
[]运算符: 成功返回非
空指针
,失败返回
空指针
#include #include using namespace std; class A { public: A (int var = 0) : m_var (var) { cout << A构造: << this << endl; } ~A (void) { cout << A析构: << this << endl; } static void* operator new (size_t size) { void* pv = malloc
2小时精通
C++
智能指针
本课程讲解
C++
11标准库
中
的智能指针。对于C/
C++
程序员来说,指针是天堂,也是地狱。指针用得好程序运行效率倍增,用得不好问题层出不穷。智能指针可以解决普通指针存在的悬垂指针、野指针、资源泄露等问题本教程的主要的演示平台为Qt 4.11和g++ 7.4。学员也可以使用Visual Studio 2017。教程
中
从最简单的例子入手,覆盖智能指针的常用技术点,并穿插实例程序。本篇讲解的技术点包括:共享指针、弱指针、唯一指针、自动指针等。本课程
中
涉及的所有软件和示例源码,均提供免费下载。
C++
构造函数
中
使用new时注意事项
使用new初始化对象
中
的指针成员时遇到的问题 在构造函数
中
使用new初始化指针成员,那么析构函数
中
就必须使
delete
,并且new对应
delete
, new[]则对应于
delete
[]。 在有多个构造函数的情况下,必须以相同的方式使用new,要不用new,要不用new[],因为只存在一个析构函数,所有的构造函数都必须与虚构函数相兼容。 PS. 当然在构造函数
中
使用new初始化指针的时候,可以把指针初始化为空(0/NULL 或者是
C++
11
中
的nullptr),因为
delete
不管有没带[]都与
空指针
兼容。 需要自行定义一个复制构造函数和赋值构造函数,用深复制的方式把一个对象初始化给另一个对象,
C++
中
,能
不能
delete
空指针
完全可以 . . . . 可能有不少人对
Delete
删除
空指针
的用法不屑一顾 , 但在实际运用当
中
, 却有不少人会犯类似的错误 , 最典型的如下: if(pMyClass) //这里, pMyClass是指向某个类的指针 . . {
delete
pMyClass ; } 他们往往先判断一下指针是否为空 , 如果不为空 , 说明没有被删除 , 于是清空这个指针 . . . 出发点和逻...
C++ 语言
64,281
社区成员
250,470
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章