Решение проблемы с объектом - PullRequest
2 голосов
/ 24 мая 2011

У меня проблема с освобождением памяти объекта. Вот мой код:

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 ]

1 голос
/ 24 мая 2011

Если в документации библиотеки нет функции для явной очистки объекта или закрытия сокета, автоматически ли он отключается, если по истечении определенного времени не происходит никаких действий?

Если выу меня есть способ сказать, если сокет все еще открыт, вы можете передать объект вспомогательному потоку, чтобы удалить его, когда он обнаружит, что сокет закрыт.

Единственное, о чем я могу думать, это то, чтоможет быть возможно повторно использовать объект для нового соединения.

1 голос
/ 24 мая 2011

Вам следует изучить деструкторы C ++, которые предназначены для того, чтобы делать то, что вам нужно. Здесь обычно выполняется очистка ресурсов, но это зависит от программиста класса. Другими словами, вполне вероятно, что деструктор objClass проводит там очистку ресурсов, но без чтения документов или кода я не могу сказать.

Тот факт, что ваше приложение зависает, в любом случае не имеет ничего общего с C ++ или деструкторами. Скорее, это вопрос о том, как вы используете свою DLL, например, вызов delete в неподходящее время или перед какой-либо ручной очисткой. Но не зная об objClass интерфейсе и семантике, я не могу помочь с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...