我希望调用析构函数一个实例( proc ),在程序结束之前总是 ,尤其是在返回1之后> em>或在主中退出()。
我发现C ++函数 atexit(),但是它需要指向void函数的指针而没有参数,所以下面的代码无法编译。 我该如何解决呢?
我的实例的析构函数需要MySQL连接。
#include <WinSock.h>
#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <mysql.h>
#include <string>
// Declarations for Mysql DB
using namespace std;
class Process {
public:
~Process();
};
Process::~Process ()
{
// Interaction with DB
}
int main(void)
{
// Join to DB
atexit(proc.~Process); // Call desctructor of instance proc before program ends
Process proc;
// App code
return 0;
}
答案 0 :(得分:5)
proc
具有自动持续时间,即退出main
时,它将被自动销毁(并且调用析构函数) - 您不需要atexit
业务..
除非@Rob在下面提到,否则你在代码中调用exit()
...如果是这种情况,那么你必须在堆上分配Process
,提供一个函数{ {1}}可以调用哪个知道此实例,并将其删除...
答案 1 :(得分:3)
只需将其设为全局std::auto_ptr<>
或std::unique_ptr<>
:
std::auto_ptr<Process> proc; // 1) initialized with NULL before main() is called
int main() {
proc.reset(new Process); // 2) re-initialized
}
// 3) proc destructor is called after main() exits
答案 2 :(得分:2)
使用C ++:
#include <memory>
std::unique_ptr<Process> g_proc;
int main()
{
g_proc.reset(new Process(some, runtime, params));
// all done!
}
静态存储持续时间的对象(例如全局变量,就像我们的g_proc
这样)在main
退出后被销毁,而unique_ptr
的析构函数将负责对象的破坏。
另外,您可以在g_proc
内设static
main
个变量,但这有点不寻常。
答案 3 :(得分:1)
稍微更改程序逻辑以动态分配Process
对象:
Process *pProc;
void killProc() {
delete pProc;
}
int main(void)
{
// Join to DB
atexit(killProc); // Call desctructor of instance proc before program ends
pProc = new Process();
Process& proc = *pProc;
// App code
return 0;
}
答案 4 :(得分:0)
由于 proc 不是指针,它将在 main ()函数的末尾自动删除,并且它的析构函数将被调用(在内存之前)解除分配)。
atexit ()函数不是C ++函数,而是标准C库的一部分。
如果需要在 main ()函数结束之前调用析构函数,则需要将 proc 变量指定为指针。
您还可以通过以下方式使用应用程序类来避免使用全局变量和C函数:
class Application
{
public:
Application() { proc = new Process(); /* other init code */ }
~Application() { delete proc; /* other clean-up code */ }
int run()
{
/* your application code goes here */
}
private:
Process *proc;
}
int main()
{
Application app;
int result = app.run();
/* Post clean-up code */
return result;
}
如果您计划使用C ++ 11,也可以依赖'unique_ptr'模板。避免使用'auto_ptr',因为它已被弃用。