自动vs堆上对象,std,dll

时间:2015-04-11 00:55:19

标签: c++ dll std

使用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时没有错误。知道为什么它在这两种情况下表现不同吗?

1 个答案:

答案 0 :(得分:0)

您使用的是CRT的DLL版本吗?如果在一个或两个中使用静态链接版本,它将失败,因为CRT的一个副本分配向量和字符串使用的内存,而另一个尝试释放它。

您必须始终使用CRT的DLL版本。

(在你的第二个版本中,你通过泄漏内存来回避问题。)