boost:scoped_ptr与遗留的C函数,将char *作为输入类型?

时间:2016-11-17 16:14:08

标签: c++ pointers boost

我是新手来推动图书馆并开始在我的工作中探索新项目。我想了解BOOST的scoped_ptr是如何工作的?到目前为止,我们在所有代码中使用原始指针,并且我建议使用SmartPointers来简化内存管理。我们的编程不是纯粹的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 使用删除后会发生什么删除会正确清理内存吗?如何验证内存是否已正确清理?

1 个答案:

答案 0 :(得分:1)

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

E.g。如果您需要使用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>;

现在你确实可以分配malloced指针并且没问题:

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`