提问人:NormalToad 提问时间:6/11/2023 最后编辑:EljayNormalToad 更新时间:6/11/2023 访问量:104
nullptr & delete (C++)
nullptr & delete (C++)
问:
我不知道 nullptr 和 delete 关键字的确切机制。
*1
type* var=new type;
var=nullptr;
*2
type* var=new type;
delete var;
我知道 *1 和 *2 是不同的,但不知道它们是如何工作的。
*1、*2 内存相关...IDK jst wnna know difference.什么时候可以使用 nullptr & delete 关键字。混合这些是不可能的吗?
答:
3赞
Pete Becker
6/11/2023
#1
my_type *ptr = new my_type;
ptr = nullptr;
在第一行之后,指向在免费存储区上分配的类型的对象。在第二行之后,指向任何有效内容。免费存储中的对象仍然存在,但此代码中没有任何内容可以获取它,因为原始指针已被 null 指针覆盖。这称为“内存泄漏”。ptr
my_type
ptr
my_type
my_type *ptr = new my_type;
delete ptr;
现在,在第二行之后,在可用存储上分配的对象已被销毁(即,其析构函数已运行),并且它占用的内存已被释放,以便以后可以在后续调用 中使用。中的值仍然是旧的指针值,但由于它不再指向任何有用的东西。这称为“悬空指针”。my_type
new
ptr
delete
悬空指针本身并没有什么坏处;如果是函数中的最后一行,则返回的函数将不再存在,因此不会有尝试访问不再存在的对象的危险。delete ptr;
ptr
my_type
但有时这并不容易,通过将有效对象设置为空指针来标记它可能是合适的:ptr
my_type *ptr = new my_type;
delete ptr;
ptr = nullptr;
现在,如果你需要检查它,你可以说
if (ptr)
// do something with the thing that ptr points at
评论
delete var;
销毁 所指向的实际对象。 将指针设置为,但保留用于指向的对象不变。他们不会做同样的事情。我不知道你说的“混合这些是不可能的”是什么意思?var
var = nullptr;
var
nullptr
var
std::make_unique
。例如 然后要么放开范围(分配的内存将被删除),要么调用以手动释放内存。基本原理:避免像 *1 中那样的内存泄漏auto var = std::make_unique<type>()
var
var.reset();
new