自动与堆上对象、std、dll
automatic vs on-the-heap objects, std, dll
使用 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时没有报错。知道为什么它在这两种情况下的行为不同吗?
您使用的是 CRT 的 DLL 版本吗?如果您在一个或两个中使用静态链接版本,它将失败,因为 CRT 的一个副本分配向量和字符串使用的内存,而另一个尝试释放它。
您必须始终使用 CRT 的 DLL 版本。
(在您的第二个版本中,您通过泄漏内存来回避问题。)
使用 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时没有报错。知道为什么它在这两种情况下的行为不同吗?
您使用的是 CRT 的 DLL 版本吗?如果您在一个或两个中使用静态链接版本,它将失败,因为 CRT 的一个副本分配向量和字符串使用的内存,而另一个尝试释放它。
您必须始终使用 CRT 的 DLL 版本。
(在您的第二个版本中,您通过泄漏内存来回避问题。)