У меня есть класс C ++ (внутри проекта dll), переменные-члены которого являются boost :: shared_ptrs для объектов других классов. Лучше назначать их внутри конструктора класса или иметь отдельную функцию init (), которая делает это.
Обычно лучше все делать в конструкторе.
Наличие функции init (), которая вызывается afterwords, подразумевает, что объект недействителен после создания, поэтому вам необходимо сохранить флаг состояния, чтобы указать, был ли вызван init (), и проверять этот флаг всякий раз, когда вызывается какой-либо публичный метод, и делать что-то подходящее для неинициализированного объекта
Я предполагаю, что значение по умолчанию для указателя на T внутри boost :: shared_ptr равно NULL. Так что если я ничего не сделаю внутри конструктора, то Boost :: shared_ptr возвращает (NULL) перед вызовом функции Init ().
Да: конструктор по умолчанию для shared_ptr инициализирует его значением NULL.
Кроме того, что происходит, когда в одном из операторов присваивания возникает проблема выделения памяти с new в одном из операторов присваивания, если я должен перехватить исключение (в Init), или это правильно сказать вызывающей стороне этого Init () перехватить это исключение? boost :: shared_ptr a (new T);
Если у вас есть конструктор: тогда все построенные члены будут уничтожены правильно (через деструктор), в то время как унитизированные объекты не будут затронуты, а память для текущего объекта будет освобождена, как будто никогда не выделена причина использовать список инициализатора).
Если вы используете init (): тогда вы должны отловить исключение, правильно очистить объект и освободить память. В зависимости от того, насколько сложным является объект, вы можете сделать это внутри init (но это трудно сделать правильно) или вызывающий должен сделать это. После этого вы должны сделать то же самое, как если бы из конструктора было сгенерировано исключение (так что это зависит от использования).
Существуют ли стандартные подходы для моделирования исключений выделения памяти внутри модульных тестов? и увидеть все объекты правильно выделены
Вы можете использовать объект фабрики для размещения объектов.
Вы передаете фабричный объект конструктору. Если вы хотите смоделировать исключение во время построения, просто передайте фиктивную фабрику, которая генерирует это соответствующее исключение.