我需要对以下代码进行一些说明。
在下面的代码中,我从 DLL 中检索接口的私有实现。
在 DLL 被卸载后(CASE #2),从接口检索到的字符串和接口本身都变得无效,并且在访问它们时会发生(预期的)访问冲突。
但令我困惑的是,当我重新加载 DLL 时,我可以再次使用接口和字符串,而无需从 DLL 中重新检索它们。
这应该以这种方式工作吗?
内存怎么会变得无效,一旦再次加载DLL,它们又突然变得有效?
这只是运气,并且由于我的测试程序相对简单,DLL 第二次方便地加载到内存中完全相同的位置?
int main(int argc, int *argv[])
{
Interface *itf;
const char *name;
{
// loads the dll and gets functions
PersistenInterface pi("PersistentInterface.dll");
// returns a private implementation of the interface
itf = pi.CreateInterface();
name = itf->GetName();
// CASE #1
cout << name << endl; // suceeds
} // dll is unloaded in ~PersistenInterface()
// CASE #2
//cout << name << endl; // crashes
//cout << itf->GetName() << endl; // crashes
{
PersistenInterface pi("PersistentInterface.dll");
// CASE #3
cout << name << endl; // suceeds !?
cout << itf->GetName() << endl; // suceeds !?
}
return 0;
}