【发布时间】:2014-04-17 14:50:36
【问题描述】:
我有一个 Visual Studio 2013 C++11 程序,我需要使用一个 API 来分配数组中的多个字符缓冲区:
int main(int argc, char* argv[])
{
char* names[10] = {};
unsigned int count = _countof(names);
some_external_api_to_get_values(count, names, &count);
// do something with the names array...
for (unsigned int i = 0; i < count; ++i)
release_objects(names[i]);
return 0;
}
我希望对象在销毁时自动释放。所以我添加了这个类,但是我错过了一些允许编译器在这个类和它期望的 char** 类型之间进行转换的东西。
template<typename T>
class release_objects_on_destruction : private boost::noncopyable
{
public:
explicit release_objects_on_destruction(T* p) : p_(p) { };
release_objects_on_destruction() : p_(nullptr) { };
~release_objects_on_destruction() { if (p_) release_objects(p_); };
T** operator&() { return &p_; };
operator T*() const { return p_; };
operator const T*() const { return p_; };
private:
T* p_;
};
int main( int argc, char* argv[])
{
release_objects_on_destruction<char> names[10];
unsigned int count = _countof(names);
// error C2664: 'int some_external_api_to_get_values(unsigned int,char**,unsigned int*)' : cannot convert argument 2 from 'release_objects_on_destruction<char> [10]' to 'char**'
some_external_api_to_get_values(count, names, &count);
return 0;
}
我缺少什么转换运算符?
【问题讨论】:
-
您将
&运算符应用于release_objects_on_destruction的数组,因此您的自定义operator&将不会被调用。 -
围绕资源创建一个包装类并使用良好的旧 RAII。
标签: c++ memory-management c++11