2011-10-13 71 views
1

我设计一个包装类的重新分配(有点类似std::autoPtr但我有不同的目的):WrapperPointer类和C++堆栈分配的对象

template <typename T> 
class ScalarPtr 
{ 
private: 
    T* m_data; 
    ... 
public: 
    ScalarPtr(T *data): m_data(data) 
    { ... } 
    T& operator*(); 
    T* operator ->(); 
    ~ScalarPtr() 
    { 
     if(m_data) 
     delete m_data; ... 
    } 
}; 

现在的问题是,当我也想用这个类栈上分配的内存对象是这样的:

float temp=... 
ScalarPtr<float> fltPtr(&temp); 

用简单的方式是通过在布尔构造函数指定是否要解除或没有,但有没有更好的办法?

回答

2

我不确定是否有比布尔标志更好的方法。如你所知(并因此询问Q),这使得界面对于最终用户而言是非直观的。

包装器/资源管理类的目的是实现RAII,其中资源本身负责隐式释放其资源(在这种情况下是动态存储器)。鉴于堆栈变量会自动销毁超出其范围,因此使用资源管理包装器似乎很奇怪。我宁愿不愿意这样做。

但是,鉴于你想通过这个包装类来保持对你的类的统一接口,最简单但并不那么优雅的方式似乎是布尔标志。

+1

+1:Boost使用额外的参数将自定义删除器传递给'shared_ptr',所以他们似乎认为它没事(布尔标志命中相同的静脉)。 –

+0

@Björn:我认为助推的主要动机是需要用不同功能发布的资源。 – visitor