处理对象问题

时间:2011-05-24 16:44:31

标签: c++ sockets

我在释放对象的内存时遇到了问题。这是我的代码:

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;,但这会挂起应用程序。

2 个答案:

答案 0 :(得分:1)

你应该调查一下C ++析构函数,这些析构函数是为了做你想做的事情。 这是通常完成资源清理的地方,但这取决于班级的程序员。换句话说,objClass析构函数可能会在那里进行资源清理,但是如果没有阅读文档或代码,我就不能说了。

无论如何,您的应用程序挂起的事实与C ++或析构函数本身无关。相反,它似乎是您使用DLL的方式的问题,例如在错误的时间调用delete,或者在进行一些手动清理之前。 但是在不知道objClass接口和语义的情况下,我无能为力。

答案 1 :(得分:1)

如果在库文档中没有显式清理对象或关闭套接字的功能,如果在一定时间后没有活动,是否会自动关闭套接字?

如果你有办法告诉套接字是否仍然打开,你可以将对象传递给帮助程序线程,以便在检测到套接字关闭时将其删除。

我能想到的唯一另一件事是可以将对象重用于新连接。