我有一个 C++ 类(在一个 dll 项目中),它的成员变量是 boost::shared_ptrs 到其他类的对象。是在类构造函数中分配它们更好,还是有一个单独的 init() 函数来做到这一点。
通常最好在构造函数中做所有事情。
拥有一个在后面调用的 init() 函数意味着该对象在构造后无效,因此您需要保留一个状态标志以指示是否已调用 init() 并在调用任何公共方法时检查该标志并执行适合未初始化对象的东西
我假设 boost::shared_ptr 中指向 T 的指针的默认值为 NULL。因此,如果我在构造函数中什么都不做,boost::shared_ptr 的 get() 在调用 Init() 函数之前返回 NULL。
是:shared_ptr 的默认构造函数会将其初始化为 NULL。
此外,当在一个赋值语句中出现内存分配问题时,我应该捕获异常(在 Init 中)还是告诉这个 Init() 的调用者捕获该异常是否好?boost::shared_ptr a(new T);
如果您有一个构造函数:那么所有已构造的成员都将被正确销毁(通过析构函数),而不会触及未初始化的对象,并且当前对象的内存将被释放,就像从未分配过一样(另一个使用的好理由初始化列表)。
如果您使用 init(): 那么您必须捕获异常并正确清理对象并释放内存。根据对象的复杂程度,您可以在 init 中执行此操作(但很难正确执行)或调用者必须执行此操作。之后,您应该像从构造函数中抛出异常一样执行相同的操作(这取决于使用情况)。
是否有标准方法来模拟单元测试中的内存分配异常?并查看所有对象都已正确释放
您可以使用工厂对象来分配对象。
您将工厂对象传递给构造函数。当您想在构造过程中模拟异常时,只需传递一个生成相应异常的模拟工厂。