升级到VS2012,导致由于不同的VC 运行时间而导致崩溃
Upgrade to VS2012 resulting in crash due to different VC++ runtimes?
我必须维护一个大型旧项目,我最近将其从Visual Studio 2008升级到Visual Studio 2012。由于它是COM服务器和OCX控件,因此创建了所有Typelib东西等导致了我设法解决的一些问题。但是,当我现在运行发行版时,我经常崩溃。
我遵循了一些建议,我在这里找到了一些建议,并能够将崩溃追踪到以下代码:
int Phx2Preview::ClearOvlElementList() {
for (int i = 0; i < (int)m_vOvlElements.size(); i++) {
P_SAFE_DELETE(m_vOvlElements[i].pPolyOrig); // <- code crashes here
P_SAFE_DELETE(m_vOvlElements[i].pPolyDispl);
}
m_vOvlElements.clear();
m_vRefElemList.clear();
m_pRefElemSelected = NULL;
return PHXE_NO_ERROR;
}
P_SAFE_DELETE
是一个宏,可以检查指针是否为空,如果它不是delete
s并将其设置为null。实际创建了实际的向量元素:
if (v1) {
tNew.pPolyOrig = new CInPolygon();
tNew.pPolyDispl = new CInPolygon();
tNew.pPolyOrig->FromSafeArray(v1);
tNew.pPolyOrig->Rotate(NULLPOINT, m_nTurnAngle*__pi/180.);
tNew.eType = (overlayET)type;
tNew.nImagenr = nImageNr;
m_vOvlElements.push_back(tNew);
}
现在,问题是CInPolygon
是来自外部库的类,它是用Visual C 7.1创建的。P_SAFE_DELETE
也在该库的标题中定义。从这里我知道混合不同的运行时版本是 bad ,这个问题使我怀疑这种混合可能是崩溃的负责。
我的问题是:为什么会发生?毕竟,由于new
和delete
都是从同一位置调用的,因此在不同的CRT之间没有实际对象。另外,当使用Visual Studio 2008编译OCX时,不会发生任何问题。这是由于纯运气吗?我猜该设置也存在基本问题。而且,我该怎么办才能解决问题?切换回VS2008?
编辑:
问: CInPolygon
的驱动器只是
CInPolygon::~CInPolygon(void) {
m_vPoints.clear();
}
这里的m_vPoints
是类中定义的std::vector<..>
。也许我应该提到CInPolygon
从中继承了:
interface IRoi {
virtual ~IRoi() {
return;
}
public:
// other stuff
};
(甚至不知道interface
是普通C 中的有效关键字...)是否可以在标题中定义基类驱动器的事实是导致问题吗?毕竟,主机程序也知道该标头。
tNew.pPolyOrig = new CInPolygon();
是的,这可以保证失败。简而言之,您的程序中的主机程序可能无法正确计算Cinpolygon对象的大小。它使用STD :: vector的完全不同的实现。在VS2012中,它充分利用了C 11。不可避免地,使用旧版本向量的库中的代码将损坏堆。
you 必须使用与完全相同的设置的编译器的完全相同的编译器进行重建。
- KMP算法和LPS表构造的运行时间
- 如何计算Big-O表示法中的平均渐近运行时间
- 用时钟测量程序的运行时间
- 如何减少代码的运行时间以对齐文本?
- 我的 c++ 应用程序中的运行时间从 0 增加到 60 太快了(例如一毫秒或一微秒)
- 使用 Qt 测量过程的实际运行时间
- 如何执行用 C++ 编写的程序的运行时间?
- 无限运行时间
- 如何优化C++键值程序以获得更快的运行时间
- 这个算法的运行时间复杂度是多少?你是如何分析的
- 两个嵌套循环的运行时间复杂性:二次型还是线性
- 重复值的最长运行时间
- 同一程序的运行时间差异很大,有时达到1000+us
- 测量 OpenCL 应用程序的运行时间
- 为什么以相同的数量插入到集合中,基于不同的方法具有不同的运行时间?
- variadic函数模板:基于n编译时值在运行时间自动n输入
- 如何修复数据库连接的C 程序运行时间错误(0xc0000005)
- Clang 在Clion Windows中,如何使用mingw-w64而不是Windows VC运行
- C 获得运行时间和内存使用量
- 升级到VS2012,导致由于不同的VC 运行时间而导致崩溃