如何在atexit()中破坏实例

时间:2011-11-18 16:40:05

标签: c++

我希望调用析构函数一个实例( 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;
}

5 个答案:

答案 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',因为它已被弃用。