我坐在這裏,下面的類問題:關於對象的生命週期和回收責任
class TagCompound : public Tag
{
public:
// [...] Constructor and other methods
void insert(Tag *t);
// [...] more modifying methods
protected:
std::vector<Tag *> _values;
};
TagCompound::insert(Tag *t)
{
_values.push_back(t);
}
這是所有的樂趣和花花公子,並與衍生的Tag
一類的堆棧和堆分配對象的工作。
當然,如果提供給TagCompound::insert()
的指針在堆上分配,它必須在外部的某個位置釋放。這意味着每個從vector中刪除某些東西的方法都必須返回已刪除的指針,以便外部可以再次釋放它,如果必須的話。
我不喜歡這樣,如果調用者忘記delete
它會很麻煩和容易出錯。
我嘗試了簡單地假定每指針在矢量_values
將堆中分配和執行的缺失在每一個某種方式從_values
刪除一些功能,並具有delete
運行的每個其餘部件在TagCompound::~TagCompound
其他的事情。
這當然完全排除堆棧指針造成無效刪除。
我也試過使用std::auto_ptr
但很快我發現它不適用於STL容器。可能有些提升,但我不想使用增強(或任何類型的第三方庫)。
我是否已經用這些方法之一的正確方式,或者是否有某種黑魔法運作得更好?