小编Cer*_*ros的帖子

我们何时打破二进制兼容性

我的印象是每当你做其中一件时:

  • 添加新的公共虚拟方法 virtual void aMethod();
  • 添加新的公共非虚方法 void aMethod();
  • 从接口实现公共纯虚方法 virtual void aMethod override;

实际上是打破了二进制兼容性,这意味着如果一个项目构建在以前版本的DLL上,那么现在有了新方法可用,它将无法加载它.

根据我使用Visual Studio 2012测试的内容,这些都没有破坏任何东西.Dependency Walker报告没有错误,我的测试应用程序正在调用适当的方法.

DLL:

class EXPORT_LIB MyClass {
public:
  void saySomething();
}
Run Code Online (Sandbox Code Playgroud)

可执行文件:

int _tmain(int argc, _TCHAR* argv[])
{
  MyClass wTest;
  wTest.saySomething();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我发现的唯一未定义的行为是,如果MyClass实现了一个纯虚拟接口,并且从我的可执行文件中,我调用了一个纯虚方法,然后在我的可执行文件使用的方法之前添加了一个新的纯虚方法.在这种情况下,Dependency Walker没有报告任何错误,但在运行时,它实际上调用了错误的方法.

class IMyInterface {
public:
  virtual void foo();
}
Run Code Online (Sandbox Code Playgroud)

在可执行文件中

IMyInterface* wTest = new MyClass();
wTest->foo();
Run Code Online (Sandbox Code Playgroud)

然后我更改界面而不重建我的可执行文件

class IMyInterface {
public:
  virtual void bar();
  virtual void foo();
}
Run Code Online (Sandbox Code Playgroud)

它现在正静静地呼唤bar()而不是foo().

做我所有的三个假设是否安全?

编辑:

这样做

class EXPORT_LIB MyClass …
Run Code Online (Sandbox Code Playgroud)

c++ dll virtual-functions abi

7
推荐指数
2
解决办法
3649
查看次数

find_if和map的函子,避免复制值

有没有办法避免副本(我猜这是引擎盖下发生了什么)的问题,为了仿std::pair函数std::map

struct request_number_find
{
  request_number_find(const unsigned __int64 &baseline) : _baseline(baseline) {}
  bool operator() (const std::pair<guid, RadioTransmitterInformation> &arg)
//-------------------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  { 
    return _baseline == arg.second.mPropagationServer.mRequestNumber; 
  }
  unsigned __int64 _baseline;
};
Run Code Online (Sandbox Code Playgroud)

即使使用C++ 11 lambda

auto it = std::find_if(mRTMap.begin(), mRTMap.end(), 
  [](const std::pair<guid, RadioTransmitterInformation> &t) -> bool { 
    return t.second.mPropagationServer.mRequestNumber == 24031;
  }
);
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我总是RadioTransmitterInformation在搜索值时看到多次调用的析构函数.

地图声明:

std::map<guid, RadioTransmitterInformation, guid_compare> mRTMap;
Run Code Online (Sandbox Code Playgroud)

guid_compare:

struct guid_compare {
  bool operator() (const guid& lhs, const guid& rhs) const{
    return lhs < rhs;
  } …
Run Code Online (Sandbox Code Playgroud)

c++

0
推荐指数
1
解决办法
113
查看次数

标签 统计

c++ ×2

abi ×1

dll ×1

virtual-functions ×1