在类中声明并且在main中创建对象时,是否隐式调用析构函数?

时间:2013-08-04 10:38:42

标签: c++

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

以下代码在哪里抛出错误..是一个隐式调用的A(),就像构造函数一样,或者在主函数中删除对象“a”。提前谢谢。

5 个答案:

答案 0 :(得分:4)

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

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

在删除之前通过delete调用析构函数释放对象占用的内存。

如果你的代码放在堆栈上,如下所示:

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循环,或者即使你只是在一个代码块周围放置大括号。

答案 1 :(得分:1)

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

示例:

class test
{
public:
    test() {}  //declared and defined
    ~test() {}  //declared and defined
}

答案 2 :(得分:1)

此代码中有3个错误:

  1. 类定义应以;
  2. 结尾
  3. 构造函数和析构函数应至少具有空白实现
  4. 每当使用new分配内存时,都应将其分配给指针

答案 3 :(得分:0)

我同意@cppcode并会写同样的内容。

但我会添加一行

A a= new A();

应该是

A *a= new A;

或者不要声明构造函数/析构函数。 C ++会为你做这件事!

答案 4 :(得分:0)

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

请原谅我的英语不好。