boost:scoped_ptr,带有接受char*作为输入类型的遗留C函数

boost:scoped_ptr with legacy C functions that takes char* as input type?

本文关键字:类型 输入 函数 char ptr scoped boost      更新时间:2023-10-16

我是boost库的新手,现在开始在我的新项目中探索它。我想了解从BOOST scoped_ptr是如何工作的?到目前为止,我们在所有代码中都使用原始指针,我建议使用smartpointer来简化内存管理。我们的编程不是纯c++语言,而是它的集成应用语言。例如,我们试图理解如何将scoped_ptr初始化为NULL,并将原始指针传递给应用程序API。考虑下面的代码

这是来自应用程序工具包的API,它接受如下参数

int SOME_API_FUNC(int obj, const char* prop, char** cValue);

我不能更改API,因为它没有发布。

现在参数cValue是我们想使用智能指针的地方,这样内存管理是自动的,因为API动态地为它分配一些内存,并分配一个值并返回。

我们试过这样声明scoped_ptr

boost::scoped_ptr<char*> pcValue(new char*());

并在API中使用,如

SOME_API_FUNC(obj, prop,&*cValue);

我的问题是,如果这个cValue在API内部分配了malloc,那么自scoped_ptr使用delete以来会发生什么?delete会正确清理内存吗?如何验证内存是否被正确清理?

您应该使用带有可自定义删除器的智能指针。

。如果您需要使用free而不是delete(默认删除器)释放该指针,请尝试:

struct free_deleter {
     template <typename T> void operator()(T* p) const {
         ::free(p);
     }
};
template <typename T> using malloc_ptr = std::unique_ptr<T, free_deleter>;

现在你确实可以分配错置指针了,而且很好:

std::unique_ptr<char[]> a(new char[100]); // ok, uses `delete[]`
std::unique_ptr<MyType> b(new MyType("param")); // ok, uses `delete`
malloc_ptr<char> legacy_buf(static_cast<char*>(::malloc(100))); //ok, uses `::free`