2015-03-13 9 views
1
  1. RAII does't выполнить деструктор, когда вызов exit .so WSACleanup не run.What проблема? Я нашел libnet использование WSAStartup без WSACleanup, почему?
  2. WSAStartup может звонить много раз в одном процессе, так как может обеспечить WSACleanup достаточно?
  3. Как использовать WSAStartup и WSACleanup легко и элегантно?
  4. Дополнительно я написал тестовый код для проверки WSAStartup без WSAClean, не обнаружил какой-либо ненормальный (рост памяти или аварии ...)

код:WSAStartup с RAII

int main(int argc, char *argv[]) 
{ 
    int res; 

    while (1) { 
     WSADATA wsadata; 
     res = WSAStartup(0x0202, &wsadata); 
     printf("WSAStartup 1 times:%d\n", res); 

     if (res != 0) { 
      printf("WSAStartup error:%d\n", WSAGetLastError()); 
      exit(1); 
     } 

     res = WSAStartup(0x0202, &wsadata); 
     printf("WSAStartup 2 times:%d\n", res); 

     if (res != 0) { 
      printf("WSAStartup error:%d\n", WSAGetLastError()); 
      exit(1); 
     } 
    } 

    return 0; 
} 

ответ

0

В мое мнение, exit уничтожит объект только тогда, когда объект будет выделен на стек, статический или глобальный. Он не должен выделяться с использованием new. В случае new объект должен быть явно удален.

Хорошо, что WSAStartup должен быть вызван при запуске приложения и WSACleanup, когда приложение заканчивается. Таким образом, вы можете определить класс, который выполняет это задание в своем конструкторе и деструкторе, и определить глобальный объект этого класса. Этот класс позаботится об этом.

У вас должно быть веское основание для инициализации WinSock несколько раз. В противном случае выполните только инициализацию, которую вы можете легко сделать.

+0

'exit' будет запускать деструктор в глобальном или статическом varialbe.Sometimes мне нужно использовать любую библиотеку, например' libnet'. Я нашел в 'libnet', которые вызывают' WSAStartup' без 'WSACleanup'. Также в моем классе когда-нибудь понадобится 'exit', поэтому RAII не работает. – qianchenglong

+0

Вот что я говорю. Он не будет уничтожать объекты, выделенные с помощью указателей. – doptimusprime

+0

@qianchenglong 'Также в моем классе когда-то нужно выйти' Затем перепроектируйте свою программу. – deviantfan

1

1) exit() является проблемой для каждый RAII вещь, а не только розетки. Откройте файлы, память ... Правильное решение - избежать exit().

2 + 3) Звоните столько же WSACleanup, сколько WSAStartup. Я думаю, вы хотите написать класс сокета с одним соединением на объект, просто вызовите WSAStartup в конструкторе и WSACleanup в деструкторе.
Оба метода используют счетчик вызовов внутри, они обрабатывают несколько вызовов без проблем.

+0

Нет, я просто тестирую и использую некоторую библиотеку типа 'libnet', которые вызывают' WSAStartup' withourt 'WSACleanup', и я также называю' WSAStartup'! – qianchenglong

+0

@qianchenglong Я не думаю, что понимаю, что вы хотите сказать. Если библиотека без какого-либо обслуживания или другой деятельности в течение 12 лет имеет плохой код, не используйте ее. – deviantfan

+0

На самом деле мне все равно. Я хочу знать, что 'WSAStartup' без' WSACleanup' вызовет любую проблему и RAII с 'exit', как решить. – qianchenglong

-1

RAII does't выполнить деструктор, когда называют exit.So WSACleanup не run.What проблема?

IME, нет. ОС может очистить себя от завершения процесса - это не глупо.

Я нашел, что libnet использует WSAStartup без WSACleanup, почему?

Дизайнеры библиотеки поняли выше - ОС будет очищаться, как и во время принудительного завершения процесса va. диспетчер задач.

WSAStartup может звонить много раз в одном процессе, поэтому как можно обеспечить WSACleanup достаточно?

Зачем вам это нужно? Просто назовите его один раз при запуске. Работа выполнена.

Как использовать WSAStartup и WSACleanup легко и элегантно?

Вызов WSAStartup один раз при запуске. Вызовите WSACleanup после выхода, если сможете, (или если вам это нравится, или если вам становится лучше :).

Дополнительно я написал этот тестовый код для тестового WSAStartup без WSAClean, не обнаружили каких-либо ненормальное (рост памяти или аварии ...)

ОС очищает, так же, как это происходит с потоками, файлами, памятью и т. д.

Если ОС рабочего стола общего назначения не заботится о выделенных ресурсах при завершении процесса, это было бы разумно нецелесообразно.

 Смежные вопросы

  • Нет связанных вопросов^_^