我总是想知道为什么在删除后将指针自动设置为NULL 不是标准的一部分.如果这一点得到解决,那么由于指针无效而导致的许多崩溃都不会发生.但是,我已经说过,我可以想到为什么标准会限制这个:
性能:
额外的指令可能会降低
delete
性能.可能是因为
const
指针.然后标准可能已经为这个特殊情况做了一些事情我想.
有没有人知道不允许这个的确切原因?
Stroustrup自己回答.摘录:
C++显然允许delete的实现将左值操作数归零,我曾希望实现会这样做,但这个想法似乎并没有受到实现者的欢迎.
但他提出的主要问题是删除的论点不一定是左值.
首先,设置为null将需要一个内存存储变量.确实,您通常在变量中有一个指针,但有时您可能想要删除刚刚计算出的地址的对象."无效"删除是不可能的.
然后是表演.您可能已经编写了代码,在删除完成后指针将立即超出范围.用null填充它只是浪费时间.而C++是一种"不需要它,然后你不需要付出代价"的语言.
如果您需要安全,那么您可以使用各种各样的智能指针,或者您可以编写自己的智能指针 - 更好,更智能.
您可以有多个指向该内存的指针.如果为delete指定的指针设置为null,则会产生错误的安全感,但所有其他指针都没有.指针只不过是一个地址,一个数字.它也可能是一个带解除引用操作的int.我的观点是你还必须扫描每一个指针,找到那些引用你刚删除的同一个内存的指针,并将它们归零.扫描该地址的所有指针并将其清空是计算密集的,因为该语言不是为此而设计的.(尽管其他一些语言构建了他们的引用,以不同的方式实现类似的目标.)
指针可以保存在多个变量中,将其中一个设置为NULL仍会在其他变量中留下无效指针.所以你并没有真正获得太多收益,你更有可能造成虚假的安全感.
除此之外,你可以创建自己的功能,做你想要的:
templatevoid deleten(T *&ptr) { delete ptr; ptr = NULL; }
因为实际上没有任何需要,并且因为它需要删除指针到指针而不仅仅是指针.
delete
主要用于析构函数,在这种情况下将成员设置为NULL是没有意义的.几行之后,在结束时}
,该成员不再存在.在赋值运算符中,删除通常后跟分配.
此外,它会使以下代码非法:
T* const foo = new T; delete foo;
如果你有一个指针数组,并且你的第二个动作是删除空数组,那么在即将释放内存时,没有必要将每个值设置为null.如果你想要它为null ..写入null给它:)
这是另一个原因; 假设delete将其参数设置为NULL:
int *foo = new int; int *bar = foo; delete foo;
bar应该设置为NULL吗?你能概括一下吗?