nullptr & delete (C++)

nullptr & delete (C++)

提问人:NormalToad 提问时间:6/11/2023 最后编辑:EljayNormalToad 更新时间:6/11/2023 访问量:104

问:

我不知道 nullptrdelete 关键字的确切机制。

*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 关键字。混合这些是不可能的吗?

C++ 指针 内存 null

评论

6赞 πάντα ῥεῖ 6/11/2023
1 泄漏内存,而 2 不会泄漏内存。
1赞 Nathan Pierson 6/11/2023
delete var;销毁 所指向的实际对象。 将指针设置为,但保留用于指向的对象不变。他们不会做同样的事情。我不知道你说的“混合这些是不可能的”是什么意思?varvar = nullptr;varnullptrvar
3赞 Pepijn Kramer 6/11/2023
不应使用新建/删除(编码准则 R.11)(除非您深陷自定义数据结构)。使用 std::make_unique 。例如 然后要么放开范围(分配的内存将被删除),要么调用以手动释放内存。基本原理:避免像 *1 中那样的内存泄漏auto var = std::make_unique<type>()varvar.reset();
3赞 Eljay 6/11/2023
被视为一种非常先进的 C++ 技术。除非你在 C++ 方面非常高级,否则不要使用它。new
4赞 molbdnilo 6/11/2023
差不多:1.你有一件东西,但忘记了它在哪里,再也找不到它了;2.你有一件东西,把它永远扔掉了,但你可以记住它曾经在哪里。

答:

3赞 Pete Becker 6/11/2023 #1
my_type *ptr = new my_type;
ptr = nullptr;

在第一行之后,指向在免费存储区上分配的类型的对象。在第二行之后,指向任何有效内容。免费存储中的对象仍然存在,但此代码中没有任何内容可以获取它,因为原始指针已被 null 指针覆盖。这称为“内存泄漏”。ptrmy_typeptrmy_type

my_type *ptr = new my_type;
delete ptr;

现在,在第二行之后,在可用存储上分配的对象已被销毁(即,其析构函数已运行),并且它占用的内存已被释放,以便以后可以在后续调用 中使用。中的值仍然是旧的指针值,但由于它不再指向任何有用的东西。这称为“悬空指针”。my_typenewptrdelete

悬空指针本身并没有什么坏处;如果是函数中的最后一行,则返回的函数将不再存在,因此不会有尝试访问不再存在的对象的危险。delete ptr;ptrmy_type

但有时这并不容易,通过将有效对象设置为空指针来标记它可能是合适的:ptr

my_type *ptr = new my_type;
delete ptr;
ptr = nullptr;

现在,如果你需要检查它,你可以说

if (ptr)
  // do something with the thing that ptr points at