2016-11-17 55 views
0

我是新来的图书馆,现在开始为我的新项目开展探索工作。我想了解BOOST的scoped_ptr是如何工作的?到目前为止,我们在所有代码中都使用了原始指针,并且我主张使用SmartPointers来简化内存管理。我们的编程不是纯粹的C++语言,而是其集成的应用程序语言。例如,我们试图了解如何将scoped_ptr初始化为NULL,并将原始指针传递给应用程序API。考虑下面boost:scoped_ptr与使用char *作为输入类型的传统C函数?

此代码是从应用程序工具包中的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的malloc API的内部分配的内部那么会发生什么情况scoped_ptr正在使用删除?请问删除正确清理内存?如何验证内存是否正确清理?

+0

您使用C的任何原因标签为C++问题?他们是不同的语言! – Olaf

回答

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` 
相关问题