自动与堆上对象、std、dll
Posted
技术标签:
【中文标题】自动与堆上对象、std、dll【英文标题】:automatic vs on-the-heap objects, std, dll 【发布时间】:2015-04-11 00:55:19 【问题描述】:使用 MS VS 2012,我创建 std::vector,然后将其传递给要填充的函数:
void foo()
std::vector<std::string> vec;
bar(vec);
void bar(std::vector<std::string> &v)
for (int i=0;i<3;i++)`
v.push_back(std::string("str"));
如果两个函数都如上定义,则没有错误。如果 bar 位于 DLL 中,则退出 foo 时会出现“BAD_BLOCK”失败。 但是,如果我改为:
void foo()
std::vector<std::string> *vec = new std::vector<std::string>();
bar(vec);
void bar(std::vector<std::string> *v)
for (int i=0;i<3;i++)`
v->push_back(std::string("str"));
使用 DLL 时没有错误。知道为什么它在这两种情况下表现不同吗?
【问题讨论】:
该dll是否与您的应用程序使用相同的编译器版本、相同的配置和相同的CRT设置编译? 相同,但事实证明,其中一个是错误的 - 见下文,我在 DLL 和调用 EXE 中都使用了静态链接的 CRT。 【参考方案1】:您使用的是 CRT 的 DLL 版本吗?如果您在其中一个或两个中使用静态链接版本,它将失败,因为 CRT 的一个副本分配了向量和字符串使用的内存,而另一个尝试释放它。
您必须始终使用 CRT 的 DLL 版本。
(在您的第二个版本中,您通过泄漏内存来回避问题。)
【讨论】:
谢谢!情况确实如此。太糟糕了,我还没有足够的声誉来投票给你:(以上是关于自动与堆上对象、std、dll的主要内容,如果未能解决你的问题,请参考以下文章