自动与堆上对象、标准、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 版本。
(在第二个版本中,您可以通过泄漏内存来回避此问题。
相关文章:
- 挂起和取消挂起一个文件DLL
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 编译标准库类型
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- C++:将外部库链接到dll库
- 在 c++ 中创建 dll 并在 delphi 中调用的标准方法
- 自动与堆上对象、标准、DLL
- 通过对dll的标准调用操作字符串的问题
- 是否有用于修改AutoHotkey_L中DLL调用功能的标准协议
- 如何在我的dll接口或ABI中使用标准库(STL)类