我在释放对象的内存时遇到了问题。这是我的代码:
void Gateway::connect(DWORD dwIP)
{
if (m_objRRSInterface != NULL)
{
//delete m_obj;
m_obj = NULL;
}
m_obj = new objClass();
m_obj->SetCallBackFn(fncp);
if (m_obj->OpenSocket(dwIP, 3002))//3002 -port number
{
m_bConnect = TRUE;
}
else
{
m_bConnect = FALSE;
delete m_objRRSInterface;
m_obj = NULL;
}
}
objClass
不是我自己的类,它是从外部.dll导入的。
OpenSocket
方法在端口3002上打开套接字连接,然后我获取fncp上的所有数据。
这个功能在我第一次调用时工作正常。
当我第二次调用该函数时出现问题。我遇到的问题是没有CloseSocket
方法可以调用可靠的关闭套接字。
我向你们提出的问题是:是否有任何方法可以处理一个物体以及所有这些物体的依赖性?
我试过调用delete m_obj;
,但这会挂起应用程序。
答案 0 :(得分:1)
你应该调查一下C ++析构函数,这些析构函数是为了做你想做的事情。
这是通常完成资源清理的地方,但这取决于班级的程序员。换句话说,objClass
析构函数可能会在那里进行资源清理,但是如果没有阅读文档或代码,我就不能说了。
无论如何,您的应用程序挂起的事实与C ++或析构函数本身无关。相反,它似乎是您使用DLL的方式的问题,例如在错误的时间调用delete
,或者在进行一些手动清理之前。
但是在不知道objClass
接口和语义的情况下,我无能为力。
答案 1 :(得分:1)
如果在库文档中没有显式清理对象或关闭套接字的功能,如果在一定时间后没有活动,是否会自动关闭套接字?
如果你有办法告诉套接字是否仍然打开,你可以将对象传递给帮助程序线程,以便在检测到套接字关闭时将其删除。
我能想到的唯一另一件事是可以将对象重用于新连接。