首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这是否是在库中提供STL函数的有效方法,而不管CRT版本如何?

这是否是在库中提供STL函数的有效方法,而不管CRT版本如何?
EN

Stack Overflow用户
提问于 2012-09-18 18:53:57
回答 1查看 208关注 0票数 1

我正在尝试将一些静态C++库迁移到带有C接口的DLL中,因此不需要为我们希望支持的每个版本的Visual (即CRT)构建一个单独的库版本。但是,我确实喜欢在一些函数调用中使用STL对象的方便。我想出了一些似乎可行的东西,但我想知道是否有一些隐藏的东西,我只是没有想到。

下面是我想出的方法来获得函数的STL版本,同时仍然保持Visual独立性。

原始图书馆功能:

代码语言:javascript
运行
复制
//library.h
...
std::wstring GetSomeString();
...
StringGenerator* mStrGen; //assume forward declared for pimpl implementation

//library.cpp
std::wstring library::GetSomeString()
{
  return mStrGen->GetString(); //returns a wstring;
}

首先,我创建了一个提供C接口的私有函数

代码语言:javascript
运行
复制
//library.h
__declspec(dllexport) void GetSomeStringInternal(wchar_t* pSomeString);

//library.cpp
void library::GetSomeString(wchar_t*& pSomeString)
{
    if(pSomeString!= nullptr) {
        delete [] pSomeString; //assumes allocated by the DLL
    }

    std::wstring tmpString(mStrGen->GetString());

    size_t stringLength(tmpString.size());

    stringToReturn = new wchar_t[stringLength + 1];

    wcscpy_s(pSomeString, stringLength + 1, tmpString.c_str());
}

接下来,我添加了一个私有函数,用于释放DLL分配的内存。

代码语言:javascript
运行
复制
//library.h
__declspec(dllexport) void FreeArray(void* arrayPtr);

//library.cpp
void library::FreeArray(void* arrayPtr)
{
 if(arrayPtr) {
   delete [] arrayPtr; 
  }
}

最后,我将返回字符串的原始C++函数转换为调用内部C接口函数的函数

代码语言:javascript
运行
复制
//library.h

std::wstring GetSomeString()
{
  std::wstring someString(L"");
  wchar_t* pSomeString= NULL;

  GetSomeStringInternal(pSomeString);
  someString = pSomeString;

  FreeArray(pSomeString);
  return someString;
}

//library.cpp
//removed GetSomeString from cpp since it is defined in header

我的想法是,由于头将在每次包含时进行编译,所以使用不同版本的CRT的应用程序将使用CRT的实现来编译该函数。传入和输出库的所有数据都使用C接口来保持兼容性,库分配和释放内存,这样您就不会遇到试图从不同版本中释放内存的CRT的一个版本。

它似乎如我所愿:

  • 此库可由使用Visual的多个版本编译的程序使用。
  • 没有内存泄漏或访问冲突。
  • 如果我修改代码,以便将内存分配到头中的GetSomeString函数中,则在试图释放该内存时确实会出现内存访问错误。
  • GetSomeString函数由库编译并包含在DLL中,但是它从未被调用,因为它不是导出的;2)编译程序总是选择它的版本,因为它是内联的。

我是否遗漏了什么,或者这是否是一种向与Visual版本无关的库提供C++接口的有效方法?

附带注意:如果我有一个使用std::shared_ptr<library>的程序,但是还没有对这个问题进行足够的研究,我就会遇到一些删除问题,并且可能会有一个关于这个问题的后续问题。

EN

回答 1

Stack Overflow用户

发布于 2012-09-18 21:42:26

有一件事我可以看到成为一个问题,如果您实际上需要通过引用传递大对象的性能原因。通过将所有数据复制到兼容格式和从兼容格式复制来处理二进制兼容性问题,这很好,直到成为性能问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12483209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档