当前位置:  开发笔记 > 编程语言 > 正文

为什么不删除将指针设置为NULL?

如何解决《为什么不删除将指针设置为NULL?》经验,为你挑选了8个好方法。

我总是想知道为什么在删除后将指针自动设置为NULL 不是标准的一部分.如果这一点得到解决,那么由于指针无效而导致的许多崩溃都不会发生.但是,我已经说过,我可以想到为什么标准会限制这个:

    性能:

    额外的指令可能会降低delete性能.

    可能是因为const指针.

    然后标准可能已经为这个特殊情况做了一些事情我想.

有没有人知道不允许这个的确切原因?



1> Dan Olson..:

Stroustrup自己回答.摘录:

C++显然允许delete的实现将左值操作数归零,我曾希望实现会这样做,但这个想法似乎并没有受到实现者的欢迎.

但他提出的主要问题是删除的论点不一定是左值.



2> sharptooth..:

首先,设置为null将需要一个内存存储变量.确实,您通常在变量中有一个指针,但有时您可能想要删除刚刚计算出的地址的对象."无效"删除是不可能的.

然后是表演.您可能已经编写了代码,在删除完成后指针将立即超出范围.用null填充它只是浪费时间.而C++是一种"不需要它,然后你不需要付出代价"的语言.

如果您需要安全,那么您可以使用各种各样的智能指针,或者您可以编写自己的智能指针 - 更好,更智能.


好点计算地址,即使这是你经常看不到的东西

3> AaronLS..:

您可以有多个指向该内存的指针.如果为delete指定的指针设置为null,则会产生错误的安全感,但所有其他指针都没有.指针只不过是一个地址,一个数字.它也可能是一个带解除引用操作的int.我的观点是你还必须扫描每一个指针,找到那些引用你刚删除的同一个内存的指针,并将它们归零.扫描该地址的所有指针并将其清空是计算密集的,因为该语言不是为此而设计的.(尽管其他一些语言构建了他们的引用,以不同的方式实现类似的目标.)



4> sth..:

指针可以保存在多个变量中,将其中一个设置为NULL仍会在其他变量中留下无效指针.所以你并没有真正获得太多收益,你更有可能造成虚假的安全感.

除此之外,你可以创建自己的功能,做你想要的:

template
void deleten(T *&ptr) {
  delete ptr;
  ptr = NULL;
}



5> snemarch..:

因为实际上没有任何需要,并且因为它需要删除指针到指针而不仅仅是指针.



6> MSalters..:

delete主要用于析构函数,在这种情况下将成员设置为NULL是没有意义的.几行之后,在结束时},该成员不再存在.在赋值运算符中,删除通常后跟分配.

此外,它会使以下代码非法:

T* const foo = new T;
delete foo;



7> Dead account..:

如果你有一个指针数组,并且你的第二个动作是删除空数组,那么在即将释放内存时,没有必要将每个值设置为null.如果你想要它为null ..写入null给它:)



8> SingleNegati..:

这是另一个原因; 假设delete将其参数设置为NULL:

int *foo = new int;
int *bar = foo;
delete foo;

bar应该设置为NULL吗?你能概括一下吗?

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有