0

我的代码如下:

class TimeManager
{
public:
 virtual ~TimeManager();
};

class UserManager : virtual public TimeManager
{
public:
 virtual ~UserManager();
};

class Server : virutal public UserManager
{
 virtual ~Server();
};


CServer *pServer;

DWORD WINAPI ServerHelper(void*);

int main()
{
 //Create server
 CreateThread(NULL, 0, ServerHelper, NULL, 0, NULL);

 std::cin.get();

 //delete server
 delete pServer;

 std::cin.get();

 return 0;
}

DWORD WINAPI ServerHelper(void *v)
{
 pServer = new CServer;

 return 0;
}

我的问题是 - 猜猜 - 我的服务器析构函数不会被调用......

我无法想象,为什么:/...(我将输出函数写入所有三个类并且服务器构造函数不输出任何内容,但其他两个都...在第二个之后!按键... (为什么是第二个而不是删除后?)

任何提示,提示,解决方案?...

我正在使用视觉工作室 2010

4

5 回答 5

2

可能您正在查看错误的服务器类。您创建一个实例,CServer而您正在显示的类定义是一个类Server。(或者,这也可能是问题中的错字。)

另外,如果你敲键盘的速度太快,在创建新线程和ServerHelper运行函数之前,你可能会在delete创建服务器之前执行。delete然后只会看到一个空指针并且什么都不做,以后创建的真实服务器对象不会被破坏。

于 2010-08-26T17:24:52.580 回答
1

使用这些类定义(其余与您发布的相同)

class TimeManager 
{ 
public: 
 virtual ~TimeManager() { cout << "~TimeManager" <<endl; }
};

class UserManager : virtual public TimeManager 
{ 
public: 
 virtual ~UserManager() { cout << "~UserManager" <<endl; }

}; 

class CServer : virtual public UserManager 
{ 
public: 
 virtual ~CServer() { cout << "~CServer" <<endl; }
}; 

运行显示

~CServer
~UserManager
~TimeManager

在我按回车的第一次和第二次之间——正如人们所期望的那样。看来您的问题在其他地方。

还要注意,CServer 类中有许多拼写错误,特别是有时是“CServer”,有时是“Server”。此外,“virtual”拼写错误,dtor 是私有的。但是其中任何一个都会阻止它编译,而不是导致运行时错误。

另请注意,您发布的代码不需要虚拟继承。您要么不必要地折腾关键字,要么您的类比您说的更复杂。

于 2010-08-26T19:01:11.653 回答
1

好的......我找到了问题的解决方案:

我从 Servers 构造函数中启动了主循环:

Server::Server()
{
MainLoop();       // <- Loop in there...
}

我通过一个额外的功能手动启动服务器来修复它,现在一切都很好:D ...

感谢所有参与的人:)...

于 2010-08-26T19:35:31.027 回答
0

CServer 是您未定义的其他类吗?您的类被定义为服务器,但您正在创建一个 CServer。

于 2010-08-26T17:26:44.953 回答
0

因此,我尝试编译此代码,但即使在修复错别字之后,它也无法编译。我修正了错别字并公开了你的服务器析构函数,一切都按我的预期工作。首先调用 Server 析构函数,然后调用 UserManager,然后调用 TimeMangager。

于 2010-08-26T17:43:32.567 回答