我正在使用Visual Studio 2005创建一个开源C++库.我想提供预构建的库以及源代码.这些用VS2005构建的库是否也适用于较新版本的Visual Studio(特别是VS Express Edition 2008)?或者我是否需要为每个VS版本提供单独的库?
简短的问题.
我只是得到了一个我应该与之接口的DLL.Dll使用来自msvcr90D.dll的crt(注意D),并返回std :: strings,std :: lists和boost :: shared_ptr.操作员new/delete不会在任何地方超载.
我假设crt mixup(发布版本中的msvcr90.dll,或者如果其中一个组件使用较新的crt重建等)最终会导致问题,并且应该重写dll以避免返回任何可能调用new/delete的内容(即任何可以在我的代码中调用删除在dll中分配的内存块(可能使用不同的crt)的任何内容).
我是对还是不对?
我正在阅读" 在dll-interfaces中使用shared_ptr ".在那篇文章中,phlipsy提出了一种方法,在他的答案结束时,不跨DLL边界传递任何特定于实现的对象.基本上,我们的想法是从DLL返回一个原始指针,并shared_ptr在原始指针的EXE中初始化.
我不认为这是正确的.让我为了简单而重新定型.
// wrong version??
// DLL
Object* createObject()
{
return new Object;
}
// EXE
std::tr1::shared_ptr<Object> p(createObject());
..
Run Code Online (Sandbox Code Playgroud)
当object被释放,由所使用的破坏上下文/堆shared_ptr是从施工过程中DLL使用的不同.
正确的使用方法shared_ptr是资源分配应该与初始化相同shared_ptr,因此分配和释放可以使用相同的堆,如下所示.
// right version
// DLL
std::tr1::shared_ptr<Object> createObject()
{
return std::tr1::shared_ptr<Object>(new Object);
}
// EXE
std::tr1::shared_ptr<Object> p(createObject());
..
Run Code Online (Sandbox Code Playgroud)
我对吗?
我有这段代码:
class DLL_API MyClassWrapper
{
private:
MyClass * m_myClass;
public:
MyClassWrapper(SIZE inputSize);
~MyClassWrapper();
inline int OutputSize();
}
typedef std::shared_ptr<MyClassWrapper> MyClassWrapperPtr;
extern "C"
{
DLL_API MyClassWrapperPtr CreatreMyClassWrapper(SIZE inputSize)
{
return std::make_shared<MyClassWrapper>(inputSize);
}
}
Run Code Online (Sandbox Code Playgroud)
但它没有用,有错误:
Error 1 error C2526: CreatreMyClassWrapper: C linkage function cannot return C++ class 'std::shared_ptr<_Ty>'
Run Code Online (Sandbox Code Playgroud)
我理解这个问题,但我该如何解决呢?
我能看到的选项是:
1-不要传递共享指针.这意味着DLL用户应该在使用它之后删除指针.
2-不要使用extern"C":这意味着我必须使用错位名称.
还有其他解决方案吗?