解构一件事

red*_*dux 0 c++ constructor

我确信这在某个地方得到了解答,但我缺乏制定搜索的词汇.

#include <iostream>

class Thing
{
public:
  int value;
  Thing();

virtual ~Thing() { std::cout << "Destroyed a thing with value " << value << std::endl; }
};

Thing::Thing(int newval)
{
  value = newval;
}

int main()
{
  Thing *myThing1 = new Thing(5);
  std::cout << "Value 1: " << myThing1->value << std::endl;

  Thing myThing2 = Thing(6);
  std::cout << "Value 2: " << myThing2.value << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出表明myThing2被破坏了,我的myThing1没有.

所以...我需要以某种方式手动解构它吗?这是内存泄漏吗?我应该避免在这种情况下使用*,如果是这样,何时适合?

Fan*_*Fox 5

黄金法则是,无论你在哪里使用,new你都必须使用delete.您正在为其创建动态内存myThing1,但您永远不会释放它,因此myThing1永远不会调用析构函数.

这与之间的区别在于myThing2myThing2是一个范围对象.操作:

Thing myThing2 = Thing(6);
Run Code Online (Sandbox Code Playgroud)

完全不相似:

Thing *myThing1 = new Thing(5);
Run Code Online (Sandbox Code Playgroud)

了解更多关于动态分配在这里.但作为一些最终建议,你应该new谨慎使用关键字,在这里阅读更多相关信息:

为什么C++程序员应该尽量减少"新"的使用?