gpt4 book ai didi

c++ - 设置多线程调试 (/MTd) (C++) 时发生崩溃

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:55 27 4
gpt4 key购买 nike

在构建动态库(C++)时,我们可以为Windows选择多线程调试(/MTd)或多线程调试DLL(/MDd)运行时库。如果我们选择Multi-threaded Debug,那么创建的动态库将负责为库中使用的所有变量分配内存。因此,以下示例将显示/MDd 设置有效而/MTd 设置失败的情况:

my_dll.h

 class MY_EXPORT DllClass
{
public:

std::vector<int> abcWorkable;


void create_new_input_workable();

};

my_dll.cpp

void DllClass::create_new_input_workable()
{
abcWorkable.push_back(3);
abcWorkable.push_back(4);
}

主要.cpp

int main(void)
{
DllClass mine;
//mine.abcWorkable.reserve(20);
mine.create_new_input_workable();

return 0;
}

这个问题有两种解决方案:一种是使用静态库而不是动态库,另一种是只在动态库或可执行文件中分配内存,例如,如果我们更改 main.cpp:

int main(void)
{
DllClass mine;
mine.abcWorkable.reserve(20);
mine.create_new_input_workable();

return 0;
}

这次它将作为变量 std::vector<int> abcWorkable 工作在可执行程序中分配内存。但是,如果类内部(dll 中)的变量难以在可执行文件中分配内存,那么此解决方案可能会失败。我再举一个例子:

my_dll.h

class MY_EXPORT DllClass
{
public:
std::list<std::vector<int> > myContainer;

void create_new_input();
}

my_dll.cpp

void DllClass::create_new_input()
{
std::vector<int> abc;
abc.push_back(2);
abc.push_back(3);
myContainer.push_back(abc);

}

主要.cpp

int main()
{
DllClass mine;
mine.create_new_input();

std::list<std::vector<int> >::iterator it = mine.myContainer.begin();
std::list<std::vector<int> >::iterator itEnd = mine.myContainer.end();
while(it != itEnd)
{
for(int i=0; i<(*it).size(); i++)
std::cout<<(*it)[i]<<std::endl;
it++;
}
return 0;
}

不可能预先为变量std::list<std::vector<int> > myContainer,分配内存。那么我的问题是我该如何处理这种情况? (除了使用静态库)谢谢。

最佳答案

当您使用/MT 构建时,每个模块都会有自己的 CRT 拷贝。有它自己的全局变量,比如 errno 和它自己的使用自己堆的内存分配器。最终程序将运行多个 CRT 拷贝。

非常很麻烦,尤其是对于您的代码。因为您从 DLL 中按值返回了一个 std::string。 DLL 使用的 CRT 拷贝分配在堆上。该对象需要调用者再次释放。但它使用了一个不同 堆并且不可能释放该对象。轰隆隆。

在这里使用/MD 是一个硬性要求。这确保每个模块都使用相同的 CRT 拷贝,并且最终程序中只存在一个实现。只要它们是使用相同的 CRT 版本构建的。

关于c++ - 设置多线程调试 (/MTd) (C++) 时发生崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21937079/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com