【问题标题】:Is it necessary to free a shared_ptr?是否有必要释放 shared_ptr?
【发布时间】:2013-10-03 09:24:30
【问题描述】:

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

我怀疑在我的单元测试中,我做错了作业。

我的实现有什么缺点,特别是有 //suspected 注释的指令?

我是否需要释放 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); 
}

【问题讨论】:

  • 在测试中,为什么不简单的使用返回的shared_ptr呢?现在您参与了复制构造函数,这可能不是您想要使用该测试进行测试的内容。
  • 另外,Class1Class2 之间的关系是什么?
  • 不,没必要
  • 我不确定我是否理解。在单元测试中,您使用复制。如果你的类支持复制,为什么要动态分配呢? (作为一般规则,如果一个类支持复制,你不应该对它使用智能指针,也不应该动态分配它,因为如果你这样做,你最终会得到动态对象和本地对象的可怕混合。选择一个或每个班级的另一个。)

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


【解决方案1】:

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

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

发生的情况是,Class2 实例 a 是通过调用 Class2 的 ctor 创建的,该 ctor 采用来自 getInstanceOfClass1 的共享指针中返回的 Class1。然后嵌套的临时(共享指针)将被自动删除在表达式末尾,删除用于在整个表达式末尾初始化aClass1 实例。

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

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

避免创建Class1 的副本。

【讨论】:

  • 哦!你是完全正确的......对班级的真实姓名保密,我对“Class2 a”而不是“Class1 a”犯了这样的错误。要编辑了!已经谢谢了!
  • 所以我知道“auto”会自动获取返回对象的类型,然后我看到您可以使用对象“ap”而无需任何强制转换.. 一个很好的建议。谢谢! (我正在尝试投票,他们说我需要声誉!...-__-)
  • @Farah auto 是 C++11 的东西,如果可以的话,使用它。但请注意up 的类型现在是std::shared_ptr&lt;Class1&gt;。如果auto 不起作用,这是您应该显式用于a 的类型。 (顺便说一句:即使代表较低,您也可以接受答案)
  • 我终于得到了特权(+1)。好吧,不幸的是,我不能使用 C++11。所以我知道我不能使用“auto”。
  • @Farah 没问题,然后使用 boost::shared_ptr&lt;Class1&gt; ap = ...。另外,您可能想阅读this
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2012-10-06
    • 2014-01-25
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多