0

在 C++ 中动态分配内存当然可以使用newor来完成deletenew如果在 C++ 程序过程中不再需要使用动态分配的指针,delete可以使用它来动态释放计算机内存。我认为,如果我没有记错的话,Stroustrep 在他的一本关于 C++ 的书中提到,mallocalloc面向对象相比,C 为编译器而不是程序员提供了“释放”或“创建”内存的选项“新”和“删除”。如果我不删除指针,那么我会遇到相当隐蔽的内存泄漏,这是不好的。

然而,仅仅删除指针——正如 Carrano、Helman 和 Veroff (CHV) 在第二版 Walls and Mirrors 中第 151-153 页上的注释——并不能消除指针。相反,删除会清空指针的内容,但会将指针留在计算机内存空间中的某个位置。

无论如何,CHV 然后说必须NULL在使用后将指针设置为delete,以摆脱这种“已删除”的构造。

在这种情况下,赋值运算符是否被重载以接受NULL为布尔值?换句话说,编译器是否告诉计算机指针应该存在于内存空间中是错误的,这意味着我告诉编译器物理上阻止一堆占据两位空间的电子通过我的计算机运行? 我在这里错过了什么吗?

4

4 回答 4

4

仅仅删除一个指针并不能摆脱指针

确实不是;它销毁指针指向的对象,并释放对象的内存。指针不受影响,最终指向无效内存。

无论如何,CHV 然后说必须在使用 delete 后将指针设置为 NULL 才能摆脱这种“已删除”结构

不,在那之后指针仍然存在;但是将其设置为 null 将确保它没有指向无效内存,这可以说是更安全的。当然,使用智能指针管理动态对象是一个更好的主意,因此您一开始就永远不会遇到无效指针。

在这种情况下,赋值运算符是否被重载以接受 NULL 作为布尔值?

不,NULL不是布尔值,它是一个空指针常量;一个不指向任何东西的特殊指针值。

换句话说,编译器是否告诉计算机指针应该存在于内存空间中是错误的,这意味着我告诉编译器物理上阻止一堆占据两位空间的电子通过我的计算机运行?

呃,什么?不,它只是告诉指针不要指向任何东西。它当然不会阻止任何电子占据任何空间。

我在这里错过了什么吗?

我认为您缺少的主要思想是指针和它指向的东西是独立的对象,具有不同的生命周期。delete将销毁具有动态生命周期的对象,但不会销毁用于引用它的指针。

于 2013-10-20T03:20:47.313 回答
1

A bit of history might help. First, there was C, with malloc, etc. e.g.:

char *ptr = malloc(100);
strcpy(ptr, "hello, world!");
free(ptr);
printf("%s\n", ptr);   /* BAD - but will PROBABLY print "hello, world!" */

malloc allocates 100 bytes, the strcpy populated it, and the free() deallocates it. What's involved in "deallocate" simply means that that memory will now be available for reuse by another call to malloc.

free() does NOT reset any pointers, nor clear the memory - hence printf above will probably still print the string as nothing will (probably) have changed. Of course, any programmer writing something like this deserves to be fired.

In order to avoid the bad usage, since free() won't reset the pointers, it's good practice for us to reset them instead as soon as we free some memory :

free(ptr);
ptr = NULL;
printf("%s\n", ptr);   /* Now we get a NULL pointer exception - which is what we want */

We WANT the Null-pointer-exception, since after the free() we shouldn't be using the value of ptr.

With C++, all these arguments are the same. delete does a few more things than free - primarily it calls the objects destructors, etc, but the basic's the same. Pointers are not reset, and the memory's still lying around - and you DO want to know if you're accessing memory that's not allocated to you - and the best way of doing that is setting your pointers to null when you delete the object.

于 2013-10-20T03:31:35.400 回答
0

与所有其他变量一样,指针本身的生命周期受范围控制。

void someFunc()
{
    int* ptr;

}//ptr dies after this bracket

因此,请始终记住在指针超出范围之前释放指针指向的内存,否则您将永远无法再次访问它!

于 2013-10-23T08:44:43.420 回答
0

nullptr使用或为空指针NULL用于防止双重删除时崩溃,而不是释放指针实际占用的内存(指针,而不是它指向的内存)。实际指针停止存在的唯一时间是作用域的结束。

于 2013-10-20T03:22:33.700 回答