c++ - 解构 *Thing

标签 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;
}

输出表明 myThing2 已被销毁,而我的 myThing1 没有。

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

最佳答案

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

这与 myThing2 的区别在于 myThing2 是一个作用域对象。操作:

Thing myThing2 = Thing(6);

与以下内容完全不同:

Thing *myThing1 = new Thing(5);

阅读更多关于动态分配的信息 here .但作为最后的建议,您应该谨慎使用 new 关键字,请在此处阅读更多相关信息:

Why should C++ programmers minimize use of 'new'?

关于c++ - 解构 *Thing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34931800/

相关文章:

c++ - 程序关闭期间 CoreMessaging.dll 中出现未处理的异常

java - 构造函数未定义错误 - Java

c++ - 实现数组初始化器

c++ - 为什么线程会减慢程序的执行速度?

c++ - MFC中改变按钮大小的方法

java - 枚举构造函数中的非静态方法引用作为参数

java - 允许递归构造函数可能有什么好处(如果有)?

javascript - 命名空间实例化时的参数

c++ - ( vector ?)析构函数中的读取访问冲突

c++ - 获取相对于指定条目路径的递归迭代目录的路径