Использование динамического выделения памяти для класса клиентского сокета в C ++ - PullRequest
2 голосов
/ 06 апреля 2011

Исходя из фона Java, я все еще борюсь с выделением памяти в C ++ и с тем, когда использовать интеллектуальный указатель, автоматическое выделение стека или динамическое выделение стека.

Однако у меня есть конкретный пример использования:

Я создал класс, который состоит только из клиентского сокета и функции, которая отправляет std :: string на целевую машину и закрывает соединение в конце.

Я использую этот клиентский класс в нескольких функциях.Функции, в которых я использую клиентский класс, запускаются определенными событиями.Поэтому каждое уведомление о событии отправляется через сокет.

У меня вопрос, стоит ли здесь использовать автоматическое распределение стека?Я думаю, да, так как мне не нужно динамическое распределение.Если это так, при каких обстоятельствах клиентский класс будет в состоянии динамически распределяться или когда это будет полезно?

Ответы [ 2 ]

1 голос
/ 06 апреля 2011

Учитывая, что дескриптор сокета / файла на самом деле является просто int дескриптором объекта, управляемого ОС, я бы пошел на выделение стека + конструкцию копирования или передачу по ссылке, когда это возможно , Вы только копируете int, и относительные издержки косвенного обращения через указатель были бы велики.

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

0 голосов
/ 06 апреля 2011

Я бы выделил в стеке, только если время жизни выделенного объекта тесно связано с процедурной областью действия.

Если вам когда-либо понадобится передавать ссылки, которые могут (должны) сохраняться послефункция возвращает, вам нужно ее динамически распределить.

1004 * Конечно, в C ++ точка быстро становится спорна для фактических объемов хранения, так как, например, STL контейнеров (вектор, список, карта ЕТ друзьям) делает их распределения элементов динамически в любом случае [1] 1006 * Такэто действительно о жизни.

Я чувствую, что управляю временем жизни по классу, а не по объему функции [1].Я регулярно получаю один экземпляр Application (class), содержащий все «глобальные» объекты, каждый из которых содержит свои объекты и т. Д. Объект приложения может быть статическим глобальным или просто размещать локальную переменную в стеке в main - это не так.очень важно до тех пор, пока вы не объявите const char [300][400] член в нем:)

$ 0,02

[1], то есть: в отсутствие особо вредного пользовательского распределителя, которым вы являетесьвероятно, в данный момент не заинтересован :) [2] С помощью замыканий область действия функции может быть очень близка к ответственности классов - так же, как функциональные языки используют замыкания для имитации шаблонов ООП

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