为什么 std::shared_ptr 有效

Why does the std::shared_ptr work?

本文关键字:ptr 有效 shared std 为什么      更新时间:2023-10-16

我在模块间内存分配/释放方面遇到了一些问题。这篇文章似乎描述了同样的错误。

这是一段代码:

我的主要应用:

#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 无关。


"> [使用shared_ptr]有什么变化?

在 DLL 方案中,可以

捆绑调用特定于 DLL 的释放函数的删除程序函数。

但是,由于shared_ptr的控制块的分配,您仍然会遇到潜在的问题。这是否表现为实际问题取决于您的构建设置(例如共享运行时库?(以及您使用的工具链。


"

以及那些在单个进程中不同的"内存管理器">(在上面链接的线程中提到(是什么

大概是每个 DLL 中的运行时。

如果所有 DLL

以及主程序都链接到单个公共 DLL 运行时,而不是静态库运行时,则所有 DLL 都使用相同的共享内存管理,并且该部分是正常的。