-3
class A
{
   public:
   A();//code for constructor
   ~A();//code for destructor
}
int main(){
{
  A a= new A();
  delete a;
}

以下代码在哪里引发错误.. 是像构造函数一样隐式调用 ~A() 还是在主函数中删除了对象“a”。提前致谢。

4

5 回答 5

4

假设您的代码已更正为以下内容:

class A
{
   public:
   A();//code for constructor
   ~A();//code for destructor
};
int main()
{
  A *a= new A();
  delete a;
}

在 delete 释放对象占用的内存之前,delete 会调用析构函数。

如果您的代码将 a 放入堆栈,如下所示:

class A
{
   public:
   A();//code for constructor
   ~A();//code for destructor
};
int main()
{
  A a;
} // <---- Here

析构函数将在封闭范围的右大括号之前调用。在这种情况下,封闭范围是函数 main。

但是如果 a 是在另一个块中创建的,如下所示:

class A
{
   public:
   A();//code for constructor
   ~A();//code for destructor
};
int main()
{
  if( 1 == 1 )
  {
      A a;
      // Do something with a
  } // <---- Here
}

析构函数将在 if 块的关闭块之前调用。这同样适用于您创建块的任何地方。在 for 循环、while 循环中,或者即使您只是在代码块周围加上大括号。

于 2013-08-04T10:51:01.833 回答
1

这段代码有3个错误:

  1. 类定义应以;
  2. 构造函数和析构函数至少应该有一个空白实现
  3. 每当您使用 分配内存new时,都应将其分配给指针
于 2013-08-04T10:47:56.713 回答
1

当你声明构造函数和析构函数时,你也必须定义它们。否则编译器会出现一些错误。你的刚刚被宣布...

例子:

班级考试
{
上市:
    test() {} //声明和定义
    ~test() {} //声明和定义
}
于 2013-08-04T10:45:06.857 回答
0

我同意@cppcode 并且会写同样的。

但我会添加这一行

A a= new A();

应该

A *a= new A;

或者不要声明构造函数/析构函数。C++ 将为您完成这项工作!

于 2013-08-04T10:52:37.323 回答
0

new 运算符返回一个指向您写入前面 new 运算符的类型的指针,因此您必须将它放在一个指针中,它的类型必须等于对象类型,或者至少指针类型必须是对象类型的基础。当您使用删除运算符时,主对象调用的析构函数。

请原谅我的英语不好。

于 2013-08-04T13:43:02.340 回答