我有一個簡單的C++類,我需要知道某個對象是否應該在程序中的某個位置被刪除或不被刪除。該機制應該跨平臺和現代C++編譯器可移植。確定一個對象是否是動態分配的或不在C++中
這樣做的一個方法可以讓我想到的是:有未通過構造函數初始化,而是由重載運營商分配新成員字段,例如:
class message
{
protected:
int id;
bool dynamic;
public:
message(int _id): id(_id)
{
// don't touch `dynamic` in the constructor
}
void* operator new(size_t size)
{
message* m = (message*)::operator new(size);
m->dynamic = true;
return m;
}
void operator delete(void* m)
{
if (((message*)m)->dynamic)
::operator delete(m);
}
};
除了形成它「感覺」錯誤,這種方法有什麼問題?
編輯:應該提到的是,對象是動態或靜態的(並且決不堆棧的局部),因此保證是任一調零或new
初始化。
*爲什麼*你需要這個嗎?我可以保證這是一種錯誤的方式,即使有辦法做你所問的事情(我相當確定沒有)。你不應該在運行時決定是否刪除一個指針,因爲你應該知道(編輯:在設計時,即就程序而言是先驗的)誰擁有什麼,它的生命週期是什麼。 – delnan
使析構函數爲'private'。那麼答案總是「是」。 –
@delnan:不,你不能保證:)這是一個優化問題。我有一個消息隊列,有很多消息傳遞;在某些情況下,它們是動態分配的,但在其他一些情況下,爲了優化起見,我可以重新使用靜態對象(當然,確保靜態對象只進入一次消息隊列)。 – mojuba