我想通過一個例子,更好地理解如何用我的類實現RAII習語:推薦的方法是什麼確保指針在我的類中正確free?RAII - 類指針和範圍
我有一個課程應該存在的課程。本着RAII的精神,因爲我需要將對此類的引用傳遞給其他類,所以我將它保存在shared_ptr中(不確定它實際上是否需要保存在shared_ptr中,但爲了好玩,它是)。在類ctor中,我使用2個緩衝區(指針),然後多次循環malloc(),使用緩衝區,然後使用free()'ing。在發生事故時,應該包含故障安全代碼以釋放緩衝區。
dtor可以看到緩衝區的唯一方法是如果我將它們聲明爲類變量,但它們只用於類ctor。
例子:
class Input
{
private:
PSOMETYPE buffer1;
public:
Input();
~Input();
}
Input::Input() : buffer1(NULL)
{
for(blahblah)
{
buffer1 = (PSOMETYPE)malloc(sizeof(SOMETYPE));
// Do work w/buffer1
if(buffer1 != NULL) { free(buffer1); buffer1 = NULL }
}
}
Input::~Input()
{
if(buffer1 != NULL) { free(buffer1); buffer1 = NULL }
}
考慮我只使用緩衝區的構造函數,是否有意義將其聲明爲私有類變量?如果我宣佈它在Ctor的範圍內,Dtor將不知道它是免費的。
我知道這是一個微不足道的例子,老實說,我可以實現這一點,因爲很容易忘記使用智能指針來引用我的類,並有一個空白的dtor,只是free()'ing,因爲我在循環內。我沒有導師或學校教育,我不確定何時應該遵循RAII成語。
這是一個C和C++想法的奇怪混合......你有使用malloc而不是新的,甚至更好的STL模板容器的原因嗎?這些與RAII概念更適合: – tmpearce 2012-03-13 16:25:00
@tmpearce:這是由於我缺乏經驗,並且使用MSDN作爲學習資源。我讚賞替代品/改進的參考。 – Lokked 2012-03-13 16:53:25