为什么不在C++中调用Destructor
Why not call Destructor in C++?
我研究了C++
的概念。我混淆了构造函数和析构函数的概念。从程序中退出时,编译器将隐式调用析构函数。但在我的程序中,只有构造函数调用了。
#include <iostream>
using namespace std;
class A
{
int i;
public:
A()
{
cout<<"Constructor call"<<endl;
}
~A()
{
cout<<"Destructtor call"<<endl;
}
};
int main()
{
A *a = new A();
}
输出:
Constructor call
所以,我有一个问题:为什么析构函数在退出程序时不被编译器隐式调用
为什么析构函数在退出程序时不被编译器隐式调用?
因为动态分配的对象不会自动销毁。这就是指定语言的方式。跟踪动态对象的销毁将需要运行时/内存开销。
解决方案:不要泄漏动态分配的对象。
C++中有两种"类型"的变量生存期。动态和自动。
自动是类似于:
void foo()
{
int i; // automatic storage
} // destroys i
这里,i
在离开作用域的那一刻(在foo
返回之后)将被销毁。你可以通过让你的对象有一个自动的生命周期来检查这一点:
int main()
{
A a; // calls A's constructor and allocates memory.
} //calls A's destructor and frees the memory used.
您将看到构造函数和析构函数都将被调用。
第二种形式是动态分配内存。您可以使用new
动态分配内存(就像您所做的那样),并使用delete
释放内存。编译器不会为您执行此操作。这意味着,要销毁对象,您必须自己显式调用delete
:
int main()
{
A* a = new A();
delete a; // calls A's destructor and frees the memory used.
}
如果你不调用delete
(就像你的代码一样),那么程序离开main
的那一刻,指针a
就被破坏了,现在我们有一块没有东西可以访问的内存,因此没有人可以清理(使用delete
),这意味着你正在泄漏内存。
然而,现代操作系统会在程序结束的那一刻自动回收程序使用的所有内存,所以在这一点上它不会太重要。这意味着你的析构函数不会像你刚才看到的那样被调用。
动态分配的内存允许您执行一些巧妙的技巧,例如控制对象的生存期,使其达到您想要使用delete
显式销毁它们的程度。使用new
和delete
的问题是,很容易忘记一个delete
,并且您的程序已经泄漏了内存,这就是为什么建议远离这种分配方式。
如果出于某种原因,您绝对需要动态生存期,那么使用像std::unique_ptr
这样的智能指针,它会在超出范围时为您调用new
和delete
。
使用new
动态创建对象。只有当使用delete
删除对象时,才会调用析构函数。
为了防止内存泄漏,您可以/应该使用像unique_ptr
这样的智能指针。
在任何情况下,当进程结束时,内存本身当然会被释放。
在代码中永远不会调用析构函数,因为对象永远不会被破坏。
您可以动态分配A
对象,但从不解除分配。将delete a;
添加到main()
中,您将看到析构函数在起作用:
int main()
{
A *a = new A();
delete a;
return 0;
}
在主函数中,您创建了一个指针变量,必须在主函数末尾的delete a
将其删除。
因为内存泄漏。您动态创建了一个具有new
的对象,并承诺将管理该对象的生存期,稍后使用delete
对其进行清理。然后你违背了承诺。
如果你以通常的方式创建一个对象:
A a;
那么它会自动为你销毁。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- IS类型INFO自动更新了以前调用Destructor
- 为什么构造函数的数量与Destructor调用的数量不匹配
- 用const_iterator成员调用类destructor时堆积损坏
- 当我要退出应用程序时,如何在QT中自动调用destructor
- 在MSVC上的数组初始化期间,destructor在不复制或移动构造方的情况下调用
- 为什么不在C++中调用Destructor
- 明确调用`int` destructor-为什么需要类型的别名
- 为什么PTHREAD_KEY_CREATE DESTRUCTOR几次调用
- 内存集调用位置的"error: expected constructor, destructor, or type conversion before '(' token"
- 使用对象引用(可能)在调用destructor后使用对象引用
- 将unique_ptr分配给引用时,在成员函数之前调用Destructor
- 有没有办法调用纯虚拟类的"deleting destructor"?
- 在c++中调用delete或destructor就足够了
- Destructor被调用两次,而没有复制构造函数或赋值运算符被调用
- MFC WinApp 在不同的线程中调用 InitInstance 和 OnAppExit/destructor