c++ - 覆盖使用 new 关键字初始化的变量 c++

标签 c++ new-operator delete-operator

如果我这样做:

void foo() {
  bar* b2 = new bar();
  b2 = new bar();
}

new 初始化的第一个 bar 值会发生什么?是被第二次赋值覆盖,还是应该事先用delete关键字删除?

最佳答案

这是内存泄漏。 C++ 已经为您的对象分配了空间,然后您丢失了对它的所有引用,因此它将坐在那里,因为您的程序运行时的其余部分将变得无用且占用空间。

这就是为什么在 C++ 中通常使用new

void foo() {
  bar b2 = bar();
  b2 = bar();
}

特别是在您只想在 1 个范围内使用变量的情况下,将其分配在堆栈上是一个更安全的选择。特别是在异常情况下,

Foo foo = new Foo();
...
delete foo;

不安全,如果...抛出异常怎么办?你漏!如果你想要 C++11 中的安全和指针语义

unique_ptr<bar> b2;

如果你真的想要指针语义。现在,当所有对 b2 的引用都丢失时,它会自行删除。注意:循环仍然没有破裂和泄漏。

关于c++ - 覆盖使用 new 关键字初始化的变量 c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20075185/

相关文章:

c++ - std::is_same_v与非专业模板

c++ - 错误重新: inheritance of private members?

typescript - VS Code 提示错误 TS7013 但 Typescript 不是

c++ - 从主函数中删除在另一个函数中使用 new 创建的一系列对象

c++ - 通过传递外部指针或通过内部调用 new 构造的类,我可以在销毁时天真地删除这个指针吗?

c++ - 递归函数计算数字中的位数

c++ - 如何在 std::transform 的 vector 中使用其他值?

class - 在 Scala final case 类中使用 new

java - 为什么不把 'new'的结果存到变量里就可以了

c++ - 禁止/重定向 C++ 删除?