我知道在一个动态链接库中分配的内存,后来在另一个动态链接库中释放可能会引起各种问题,特别是涉及到CRT时。当涉及到导出STL容器时,这些问题尤其棘手。我们以前曾经遇到过这些问题(在编写自定义Adobe插件并链接到我们的库时),我们通过定义自己的分配器并在所有容器中使用它来解决了这些问题,例如:
typedef std::vector < SessionFields,
OurAllocator < SessionFields > >
VectorSessionFields;
typedef std::set < SessionFields,
std::less < SessionFields >,
OurAllocator < SessionFields > >
SetSessionFields;
在向/从我们的代码传递类型时,这种方法很有效,但是现在我们遇到了一个问题,即我们现在必须调用Adobe的SDK中返回填充向量的函数,当它超出范围时会导致崩溃。
显然,这是一个内存问题,Adobe的SDK中分配的内存属于另一个堆栈,在我的代码中最终释放。因此,我想也许我可以做一些聪明的事情,比如某种方式覆盖或导出他们SDK中使用的分配器,以便我可以使用它来清理从他们的函数返回的容器。
我还在考虑编写包装器或某种缓冲层,从而可以安全地在我的代码和SDK之间传递STL容器(尽管这听起来非常混乱)。
或者,我还在考虑使用GetProcessHeaps
来识别SDK中使用的堆栈,并尝试针对该堆栈进行释放,而不是默认堆栈。
有人能给出解决这个问题的建议吗?
std::scoped_allocator_adaptor
,即使您有一个std::vector
的std::string
,这也可以工作。然后字符串将使用向量捕获的分配器。 - MSalters