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

Ada*_*dam 1 c++ new-operator delete-operator

如果我做类似的事情:

void foo() {
  bar* b2 = new bar();
  b2 = new bar();
}
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*zer 5

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

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

void foo() {
  bar b2 = bar();
  b2 = bar();
}
Run Code Online (Sandbox Code Playgroud)

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

Foo foo = new Foo();
...
delete foo;
Run Code Online (Sandbox Code Playgroud)

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

unique_ptr<bar> b2;
Run Code Online (Sandbox Code Playgroud)

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