是否有必要释放shared_ptr?

时间:2013-10-03 09:24:30

标签: c++ unit-testing boost shared-ptr smart-pointers

我正在使用Boost库从智能指针中受益: shared_ptr

我怀疑在我的单元测试中,我的任务很糟糕。

我的实施有哪些缺点,特别是 //怀疑评论的实施?

我是否需要免费的shared_ptr 指针(我想在我的单元测试中分配的方式不可能)?

有什么建议吗?非常感谢!

在Class2声明中:

static boost::shared_ptr<Class1> getInstanceOfClass1();

在Class2定义中:

boost::shared_ptr<Class1> Class2::getInstanceOfClass1()
{
    boost::shared_ptr<Class1> inst1 = boost::make_shared<Class1>();

    //.... some instructions on inst1

    return inst1 ;
}

在使用Boost.Test的单元测试中:

BOOST_AUTO_TEST_CASE( test_some_label_here )
{
    string input;
    //instructions...
    // mocking the input
    //...

    Class1 a = *(Class2::getInstanceOfClass1()); //suspected
    int code = a.useInputAndReturnCode(input);

    // having CODE_X as a macro
    BOOST_CHECK_EQUAL(code, CODE_X); 
}

2 个答案:

答案 0 :(得分:1)

虽然这是一个奇怪的用例,但应该没问题。

Class2 a = *(Class2::getInstanceOfClass1()); //suspected

通过调用Class2的ctor创建a实例Class2,其中Class1getInstanceOfClass1获取共享指针中返回的Class1 。嵌套的临时(共享指针)将在表达式的末尾自动删除,删除用于在整个表达式末尾初始化a的{​​{1}}实例

么?也许你打算写Class1 a = ...?在这种情况下,我建议你考虑

auto ap = Class2::getInstanceOfClass1();
int code = ap->useInputAndReturnCode(input);

避免创建Class1

的副本

答案 1 :(得分:1)

您不必释放shared_ptr,因为当没有shared_ptr指向它时,指向的对象会自动销毁。 另一方面,你必须确保不要在同一个对象上混合shared_ptr和常规指针:如果对象被boost破坏,因为没有shared_ptr指向它,你会在尝试访问它时因为常规指针而出错