【发布时间】:2015-05-20 18:54:17
【问题描述】:
我试图准确了解 C++ 中删除的变量会发生什么。假设我有类似以下内容。
MyObject * obj;
for (int i = 0; i < 100000000; i++){
obj = someMethodThatReturnsNewMyObject();
obj->doSomething();
delete obj;
}
现在,在实例化时,obj 是一个指向 MyObject 对象的指针。它首先由obj = someMethodThatReturnsNewMyObject(); 行初始化。然后为了好玩而调用了一些方法,并删除了obj。现在我知道当像这样删除某些东西时,它指向的内存空间被删除,并且指针被设置为指向一个空。
但是,当 for 循环返回时,我重新初始化指针,导致它分配一个新的内存空间,obj 然后指向这个新空间。但是,指针本身从未从内存中删除。在整个循环中,它只会指向我告诉它指向的任何内容或指向任何内容(删除时)。
那么我的问题是:指针本身,即指针占用的内存空间何时被删除,为什么如果我需要删除内存指向?
【问题讨论】:
-
自动存储时长。变量在其块的末尾超出范围。在现实生活中,它们会在函数结束时脱离堆栈。
-
必选:在现代 C++ 中,如果您在应用程序代码中有
delete,那么您做错了。使用shared_ptr和unique_ptr(或其他智能指针),并让它们在超出范围时删除对象(如果删除是适当的)。这称为 RAII。 -
请阅读任何有关指针的任何编程语言书籍。 (或有视频:youtube.com/watch?v=i49_SNt4yfk)
-
"并且指针被设置为指向空" 这不会自动发生。这里其实并不需要,但是应该在删除后的循环末尾加上
obj = NULL;。 -
你的假设有点不对劲。
delete函数不会“设置为不指向任何内容”。delete调用根本不会触及obj的值。它仍然指向相同的内存位置。不同之处在于它指向 /unallocated/ 内存位置,尝试访问它可能会导致意外错误。因此,随后用新值覆盖obj是完全可以的。