c++ - 如何调用破坏函数?

标签 c++ constructor destructor

#include<iostream>
using namespace std;
class Monster {

  public: 
  Monster() {cout << "with out argument. \n";}
  Monster(int sz) { cout << "Monster created.\n"; }
  ~Monster() { cout << "Monster destroyed.\n"; }

  int GetSize() { return itsSize; }
  void SetSize(int str) { itsSize = str; }

private:
  int itsSize;
};

int main()
{
  Monster *m;
  m =new Monster[3];
  for(int i = 0; i < 3; i++)
     m[i] = i; // constructor with argument is getting called for each elements after which why destructor is getting called for each element.          
  delete []m;
  return 0;
}

Output:
with out argument. 
with out argument. 
with out argument. 
Monster created. // Monster constructor with argument is getting called.
Monster destroyed. // 1. Why this destructor is getting called after each call of constructor.
Monster created.
Monster destroyed. //2.
Monster created.
Monster destroyed. //3.
Monster destroyed.
Monster destroyed.
Monster destroyed.

当我用值初始化 Monster 对象数组时,参数化的构造函数被调用,紧接着为什么调用析构函数?

最佳答案

m =new Monster[3];

这里创建了三个对象,为每个对象调用了默认构造函数。这就是为什么您会看到消息没有参数。

m[i] = i;

首先,使用 Monster(int) 构造函数在右侧创建临时 Monster。这就是您看到消息 Monster created. 的原因。接下来,调用赋值运算符。接下来,您的临时 Monster 被删除。这就是您看到 Monster destroyed. 的原因。

delete []m;

阵列中的三个怪物被摧毁。


为了更好地理解这种情况,我建议您将this 的地址添加到您的所有消息中。

关于c++ - 如何调用破坏函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36838380/

相关文章:

c++ - 返回值优化的魔力是什么?

c# - 为什么我每次调用 web 方法时都会调用我的 WebService 构造函数?

c++ - 为什么构造函数在某些情况下不起作用?

c++ - 对象析构函数中 "string"成员是否需要调用析构函数?

C++ SDL_FreeSurface 在析构函数中崩溃

c++ - 为什么 STL 实现不使用断言来检测未定义的行为?

c++ - Win32 上的内存不足 (?) 问题(与 Linux 相比)

C++ 虚拟析构函数和内存泄漏

c++解析带格式的字符串

c++ - 将带有模板的自定义类插入 std::map