内存泄漏、赋值运算符重载、新建、删除和C++; < > C++中动态分配内存当然可以使用新< /COD>或删除< /代码>。如果在C++程序中不再需要使用新< /代码>动态分配的指针,则可以使用“代码>删除”/代码>以动态释放计算机内存。我认为,如果我的记忆正确,他在他的一本C++书籍中提到的“代码> > MalcC 和 AcLC/提供了编译器而不是程序员选择“释放”或“创建”内存,这与面向对象的“新”和“删除”相反。如果我不删除指针,那么我将遇到一个相当隐蔽的内存泄漏,这是不好的

内存泄漏、赋值运算符重载、新建、删除和C++; < > C++中动态分配内存当然可以使用新< /COD>或删除< /代码>。如果在C++程序中不再需要使用新< /代码>动态分配的指针,则可以使用“代码>删除”/代码>以动态释放计算机内存。我认为,如果我的记忆正确,他在他的一本C++书籍中提到的“代码> > MalcC 和 AcLC/提供了编译器而不是程序员选择“释放”或“创建”内存,这与面向对象的“新”和“删除”相反。如果我不删除指针,那么我将遇到一个相当隐蔽的内存泄漏,这是不好的,c++,pointers,memory,memory-leaks,C++,Pointers,Memory,Memory Leaks,然而,仅仅删除一个指针——正如Carrano、Helman和Veroff(CHV)在《墙与镜》第二版第151-153页所指出的那样——并不能消除指针。相反,delete会清空指针的内容,但会将指针留在计算机内存空间的某个位置 在任何情况下,CHV都会说,在使用delete之后,指针必须设置为NULL,以摆脱这个“deleted”结构 在这种情况下,赋值运算符是否重载以接受NULL作为布尔值?换句话说,编译器是否告诉计算机指针应该存在于内存空间中是错误的,这意味着我告诉编译器物理上阻止一束占据两位

然而,仅仅删除一个指针——正如Carrano、Helman和Veroff(CHV)在《墙与镜》第二版第151-153页所指出的那样——并不能消除指针。相反,delete会清空指针的内容,但会将指针留在计算机内存空间的某个位置

在任何情况下,CHV都会说,在使用
delete
之后,指针必须设置为
NULL
,以摆脱这个“deleted”结构

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

仅仅删除指针并不能消除指针

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

在任何情况下,CHV都会说,在使用delete之后,指针必须设置为NULL,以摆脱这个“deleted”构造

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

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

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

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

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

我是不是遗漏了什么

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

仅仅删除指针并不能消除指针

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

在任何情况下,CHV都会说,在使用delete之后,指针必须设置为NULL,以摆脱这个“deleted”构造

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

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

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

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

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

我是不是遗漏了什么


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

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

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

一点历史记录可能会有所帮助。首先,有C,有malloc等。例如:

char *ptr = malloc(100);
strcpy(ptr, "hello, world!");
free(ptr);
printf("%s\n", ptr);   /* BAD - but will PROBABLY print "hello, world!" */
malloc分配100个字节,strcpy填充它,free()释放它。“deallocate”所涉及的只是意味着该内存现在可以通过另一个malloc调用重用

free()不会重置任何指针,也不会清除内存-因此上面的printf可能仍会打印字符串,因为(可能)没有任何更改。当然,任何编写这种东西的程序员都应该被解雇

在ord中
free(ptr);
ptr = NULL;
printf("%s\n", ptr);   /* Now we get a NULL pointer exception - which is what we want */
void someFunc()
{
    int* ptr;

}//ptr dies after this bracket