我是新手来推动图书馆并开始在我的工作中探索新项目。我想了解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 使用删除后会发生什么? 删除会正确清理内存吗?如何验证内存是否已正确清理?
答案 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`