为什么 std::shared_ptr 有效
Why does the std::shared_ptr work?
我在模块间内存分配/释放方面遇到了一些问题。这篇文章似乎描述了同样的错误。
这是一段代码:
我的主要应用:
#pragma comment(lib, "mydll.lib")
__declspec(dllimport) std::shared_ptr<VOID> GetMemory(size_t size);
int wmain(int argc, wchar_t* argv[])
{
std::shared_ptr<VOID> lpMem = GetMemory(100);
return 0;
}
dll 代码:
__declspec(dllexport) std::shared_ptr<VOID> GetMemory(size_t size);
BOOL WINAPI DllMain(HINSTANCE, DWORD dwReason, LPVOID)
{
return TRUE;
}
std::shared_ptr<VOID> GetMemory(size_t size)
{
return std::shared_ptr<VOID>(new (std::nothrow) char[size]);
}
正确处理/MT
或/MD
编译器标志。执行不会失败。
我的问题是:为什么std::shared_ptr
的解决方案可以正常工作?它改变了什么?那些在单个进程中不同的"内存管理器"(在上面链接的线程中提到(是什么?这只是一个 CRT 抽象吗?或者,CRT 是否提供了内存分配的一些特定实现?
我认为,任何new
/malloc
/LocalAlloc
的呼吁都会导致HeapAlloc
.我说的对吗?如果是这样,为什么在单个进程中的不同模块中new
/delete
调用(未用std::shared_ptr
包装(会导致崩溃?
re
"> 为什么带有 std::shared_ptr 的解决方案可以正常工作?
因为你有未定义的行为,而UB包括你希望发生的事情,发生了。它是 UB,因为使用 new[]
表达式创建的对象需要使用delete[]
表达式销毁。默认情况下,shared_ptr
通过delete
表达式销毁。
这与是否涉及 DLL 无关。
再
在 DLL 方案中,可以"> [使用
shared_ptr
]有什么变化?
捆绑调用特定于 DLL 的释放函数的删除程序函数。
但是,由于shared_ptr
的控制块的分配,您仍然会遇到潜在的问题。这是否表现为实际问题取决于您的构建设置(例如共享运行时库?(以及您使用的工具链。
再
"以及那些在单个进程中不同的"内存管理器">(在上面链接的线程中提到(是什么
大概是每个 DLL 中的运行时。
如果所有 DLL以及主程序都链接到单个公共 DLL 运行时,而不是静态库运行时,则所有 DLL 都使用相同的共享内存管理,并且该部分是正常的。
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 自定义先决条件对移动分配运算符有效吗
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 为什么这种直接初始化有效?(C++17)
- 递归函数有效,但无法记忆
- 在C++中初始化向量映射的最有效方法
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 如何检测ptr在引用超出范围后是否仍在引用有效引用
- 为什么 std::string{ "const char ptr" } 有效?