我的印象是每当你做其中一件时:
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) 有没有办法避免副本(我猜这是引擎盖下发生了什么)的问题,为了仿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)