代码之家  ›  专栏  ›  技术社区  ›  Tarnschaf

在dll接口中使用boost::shared ptr可以吗?

  •  10
  • Tarnschaf  · 技术社区  · 16 年前

    在C++中开发一个返回Boost共享指针并使用它们作为参数的DLL是有效的吗?

    那么,可以导出这样的函数吗?

    1.) boost::shared_ptr<Connection> startConnection();
    2.) void sendToConnection(boost::shared_ptr<Connection> conn, byte* data, int len);
    

    在特殊情况下:引用计数是跨dll边界工作的还是要求exe和dll使用相同的运行时?

    其目的是克服对象所有权的问题。所以当dll和exe不再引用它时,对象就会被删除。

    5 回复  |  直到 11 年前
        1
  •  10
  •   Community Mohan Dere    9 年前

    根据有效C++(第三版)中的Scott Meyers,SydDypTRS在DLL边界上是安全的。共享的_ptr对象从创建它的dll中保留一个指向析构函数的指针。

    在他第18项的书中,他说,“这是 tr1::shared_ptr是自动使用其每指针删除程序 为了消除另一个潜在的客户端错误,“交叉DLL问题”。 当使用New-In-One创建对象时,会出现此问题 动态链接库(dll),但在另一个dll中被删除。论 许多平台,如跨dll的新建/删除对会导致运行时 错误。tr1::shared_ptr避免了这个问题,因为它的默认删除程序 使用从创建tr1::shared_ptr的同一个dll中删除。“

    不过,提姆·莱舍提到了一个有趣的问题 here . 您需要确保在共享指针最终超出作用域之前,不会卸载创建共享指针的dll。我会说,在大多数情况下,这不是你必须注意的,但是如果你创建的DLL是松散耦合的,那么我建议不要使用共享的指针。

    另一个潜在的缺点是确保两边都是用兼容版本的Boost库创建的。Boost的共享资源已经稳定了很长一段时间。至少从那时起 1.34 它与TR1兼容。

        2
  •  4
  •   RC.    16 年前

    在我看来,如果它不在标准中,也不是您的库提供的对象/机制,那么它不应该是到库的接口的一部分。您可以创建自己的对象来进行引用计数,也许在下面使用boost,但不应该在接口中显式地公开它。

        3
  •  2
  •   anon    16 年前

    DLL通常不拥有资源-资源由使用DLL的进程拥有。您最好返回一个普通指针,然后将其存储在调用端的共享指针中。但如果没有更多的信息,很难百分之百地确定这一点。

        4
  •  2
  •   Zac    16 年前

    如果从DLL接口公开原始指针,则需要注意的事项。它强制您使用共享的DLL CRT,在一个CRT中分配的内存不能在另一个CRT中释放。如果您在所有模块(dll的&exe的)中使用共享的dll-crt,那么您很好,它们都共享同一堆,如果不这样做,您将跨越crt,世界将崩溃。

    除此之外,我同意这个公认的答案。创建工厂可能不应该为客户机代码定义所有权和生命周期管理。

        5
  •  0
  •   Ben Voigt    11 年前

    不,不是。

    布局 boost::shared_ptr<T> DLL边界的两边可能不相同。(布局受编译器版本、打包pragma和其他编译器选项以及boost源代码的实际版本的影响。)

    只有“标准布局”(C++ 11中的一个新概念,与旧的“POD =普通旧数据”概念)类型可以安全地在单独构建的模块之间传递。