Сбой вызова C ++ Destructor - PullRequest
       10

Сбой вызова C ++ Destructor

1 голос
/ 17 января 2012

У меня есть этот код:

DManag::~DManag() {

    printf("in dest\n");
    if(mainConn.IsOpen()) {
        printf("about to close\n");
        mainConn.Close();
        printf("closed!\n");
    }
    printf("end dest\n");

}

Вывод: in dest \n about to close \n и все.

Кажется, что он (mainConn -> класс CDatabase) молча терпит неудачу при вызове close().Я знаю, что вы должны закрывать связи, как только закончите с ними.Но я унаследовал этот код от кого-то другого, но программа не предоставляет простой способ закрыть соединение в нужное время.Вызовы close () и open () расположены в afxdb.h.

Есть идеи, почему это может не получиться?Спасибо!

1 Ответ

3 голосов
/ 17 января 2012

Кажется, проблема в том, что CDatabase::Close вызывает исключение и вызывает обход остального деструктора.В документации не упоминается, что этот метод может генерировать, но другие примеры использования в Интернете указывают, что он может.

Попробуйте изменить деструктор следующим образом

DManag::~DManag() {
    printf("in dest\n");
    if(mainConn.IsOpen()) {
        printf("about to close\n");
        try {
          mainConn.Close();
        } catch (CDBException&) {
          print("exception occurred\n");
        }
        printf("closed!\n");
    }
    printf("end dest\n");
}
...