【发布时间】:2025-12-11 00:05:01
【问题描述】:
所以,我有一个 C++ 库,其中包含 MSVCRT 的静态链接副本。我希望任何人都能够将我的库与任何版本的 MSVC 运行时一起使用。实现这一目标的最佳方法是什么?
我已经非常小心处理事情的方式了。
- 内存永远不会通过要释放的 DLL 屏障
- 运行时 C++ 对象不会跨越障碍(即矢量、地图等。除非它们是在障碍的那一侧创建的)
- 没有文件句柄或资源句柄在屏障之间传递
然而,我仍然有一些导致堆损坏的简单代码。
我的图书馆里有一个像这样的对象:
class Foos
{
public: //There is an Add method, but it's not used, so not relevant here
DLL_API Foos();
DLL_API ~Foos();
private:
std::map<std::wstring, Foo*> map;
};
Foos::~Foos()
{
// start at the begining and go to the end deleting the data object
for(std::map<std::wstring, Foo*>::iterator it = map.begin(); it != map.end(); it++)
{
delete it->second;
}
map.clear();
}
然后我像这样在我的应用程序中使用它:
void bar() {
Foos list;
}
从任何地方调用此函数后,我都会收到有关堆栈损坏的调试警告。如果我真的让它用完,它实际上会破坏堆栈和段错误。
我的调用应用程序是使用 Visual Studio 2012 平台工具编译的。该库是使用 Visual Studio 2010 平台工具编译的。
这只是我绝对不应该做的事情,还是我实际上违反了使用多个运行时的规则?
【问题讨论】:
-
如果从析构函数中删除代码,错误是否仍然发生? (我问是因为这段代码应该是无操作的)
-
@anatolyg 是的,从析构函数中删除所有代码时,我仍然会遇到堆栈损坏
-
它所做的一切都是创建
map字段(因为它不是指针)然后销毁它。这显然会导致堆栈损坏。如果我以 VS2010 为目标并以这种方式构建我的应用程序,它可以正常工作
标签: c++ visual-c++ msvcrt