相关疑难解决方法(0)

使用不同版本的Visual Studio创建的C++库是否相互兼容?

我正在使用Visual Studio 2005创建一个开源C++库.我想提供预构建的库以及源代码.这些用VS2005构建的库是否也适用于较新版本的Visual Studio(特别是VS Express Edition 2008)?或者我是否需要为每个VS版本提供单独的库?

c++

22
推荐指数
3
解决办法
1万
查看次数

从dll返回std :: string/std :: list

简短的问题.

我只是得到了一个我应该与之接口的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)的任何内容).

我是对还是不对?

c++ dll winapi

12
推荐指数
2
解决办法
6479
查看次数

正确使用shared_ptr来消除DLL边界的重新分配

我正在阅读" 在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)

我对吗?

c++ shared-ptr

5
推荐指数
1
解决办法
3414
查看次数

如何在dll中创建shared_ptr并通过工厂函数导出它?

我有这段代码:

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":这意味着我必须使用错位名称.

还有其他解决方案吗?

c++ dll shared-ptr

3
推荐指数
1
解决办法
2564
查看次数

标签 统计

c++ ×4

dll ×2

shared-ptr ×2

winapi ×1