【问题标题】:Should a library use an interface that uses smart pointers?库应该使用使用智能指针的接口吗?
【发布时间】:2010-08-28 04:52:33
【问题描述】:

我开始编写一个库并考虑它的接口。我之前写的库都使用原始指针(内部和接口中),现在想试试VS2010自带的智能指针库。

  1. 接口应该使用智能指针吗? (可能会强制库用户也使用智能指针?)
  2. 如果接口使用原始指针而库在内部使用智能指针,会不会很混乱? (有可能吗?shared_ptr 没有 release() 方法...)
  3. 两个兼容 c++0x 的智能指针库(比如 boost 和 VS2010)可以互换使用吗? (假设我使用 VS2010 编写库,用户使用 boost)

请帮忙:)

【问题讨论】:

  • 1.是的,请强制您的用户形成良好的编程习惯。 :)

标签: c++ smart-pointers


【解决方案1】:

如果不深入了解您的设计原则以及您希望如何使用该库,就不可能回答这些问题。

所以我只能根据我的经验和我喜欢使用我的库的方式来回答。

  1. 是的。
  2. 是的。不要这样做。
  3. 混合它们可能不是一个好主意(尽管我从未尝试过)。
    但您可以弥补这一点:
    由于大多数开源代码都是作为源代码分发的,因此您可以构建自己的源代码,以便将其配置为在许多环境中使用。

例如:

#if   defined(MY_PROJ_SHARED_PTR_FROM_BOOST)

#include <boost/shared_ptr.hpp>
#define MY_PROJ_SHARED_PTR_NAMESPACE    boost

#elif defined(MY_PROJ_SHARED_PTR_FROM_STD)

#include <memory>
#define MY_PROJ_SHARED_PTR_NAMESPACE    std

#elif defined(MY_PROJ_SHARED_PTR_FROM_TR1)

#include <tr1/memory>
#define MY_PROJ_SHARED_PTR_NAMESPACE    std::tr1

#else
#error "MY_PROJ_SHARED_PTR_FROM_<XXX> not defined correctly"
#endif


namespace X
{
    using ::MY_PROJ_SHARED_PTR_NAMESPACE::shared_ptr;
}


int main()
{
    X::shared_ptr<int>  data;
}

我相信还有其他方法可以做到这一点。
但是已经晚了。

【讨论】:

    【解决方案2】:
    1. 取决于您认为 #2 还是 #3 更重要。
    2. 是的。
    3. 不,除非它们是故意设计的。

    【讨论】:

      【解决方案3】:

      我想说在这里使用 80-20 规则。如果 80% 的客户会更好地使用符合 boost/stl/C++ 标准,那么请这样做。对于其余部分,您可以构建适配器层并将复杂性移至该层。适配器设计模式是我最喜欢的。

      【讨论】:

        【解决方案4】:

        从用户的角度来看,我想说的是,您只需要在界面中明确您需要什么。

        您需要对象的副本还是只需要一个指针?

        在内部,您可能可以使用您最方便的指针类型,只要它不会过多降低性能并且不会导致错误。

        要问的一个问题是,您将使用该指针具体做什么?你会删除它吗?如果我更新/删除对象(比如在 GUI 库的情况下),我可以更改引用吗?

        作为在不需要智能指针时通常不使用智能指针的人,看到太多智能指针只会告诉我你不注意你会做什么,这会导致潜在的错误。

        作为一个库用户,我更喜欢崩溃(尝试取消引用明显无效的指针时)而不是有一个半有效的指针,这实际上不是我所期望的(我怀疑这可能是使用智能指针的问题shared_ptr 种类)。

        【讨论】:

        • “作为在不需要智能指针时通常不使用智能指针的人,看到太多智能指针只会告诉我你不注意你会做什么”对。你能告诉我不应该把指针包裹起来的情况吗?
        • 你能告诉我什么时候应该的情况吗?通常所有权很容易评估,并且 scoped_ptr 就足够了。其他指针只是别名,不需要任何特殊指针。我认为可能存在 shared_ptr 有用的情况,否则我会把球扔给你,问你为什么要自己使用 shared_ptr?我通常不会有太多问题来保持我的指针的所有权并知道我什么时候可以删除它。
        • @n1ck:嗯,每一种情况。我有一个资源,我需要确保它被释放,无论是面对健忘还是异常。唯一的方法是在析构函数中。为什么我不会?我想要一个共享指针,因为我有一个共享资源......我不想关心它什么时候被释放,我只想知道它会怎样。我能想到的唯一情况是非拥有指针(无论如何它都会被包装在某个实用程序中,谁使用非拥有指针来达到某种目的。)
        • @n1ck:我对你移动球门柱感到困惑。首先你说“当不需要智能指针时你不需要智能指针”,我说“什么时候不需要?”现在你以某种方式提出了 scoped_ptr 与 shared_ptr。 scoped_ptr 也是一个智能指针......异常是一个错误?!我想我们已经完成了,你显然不了解现代 C++ 或良好的编码实践。如果您不必显式地释放某些东西,那么您的代码会更干净、更安全。它不会杀死你,你可以在性能敏感的应用程序中使用它们;这不像他们的慢。你唯一的反对似乎是……
        • @n1ck:你说异常是一个错误,它们是一种语言特性。你说你不需要智能指针并且不要使用它们,我说这是不好的做法。然后你开始说关于作用域指针的事情很好,共享指针不是(完全偏离主题),现在关于崩溃的事情。我不知道你在说什么。
        猜你喜欢
        • 2012-07-02
        • 1970-01-01
        • 2012-07-14
        • 1970-01-01
        • 2017-07-18
        • 2014-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多