2015-06-22 127 views
0

的價值我問了一個問題:檢查刪除對象

Detecting if an object is still active or it has been destroyed

考慮,我不能使用庫,沒有好的出在C盒解決方案++。所以,它是一個不好的做法,檢查對象已經被分析內存銷燬已刪除對象居住在哪裏,考慮下面的代碼:當創建類Foo的對象

#include <stdio.h> 

class Foo { 
public: 
    static unsigned int foo_id_gen; // unique id generator 
    unsigned int id; 
    int a; 
    Foo() { 
     ++foo_id_gen; 
     if (foo_id_gen == 0) {   // Handle rollover of unique ID 
     ++foo_id_gen; 
     } 
     id = foo_id_gen;     // Set unique ID 
    } 
    ~Foo() { 
     id = 0;       // Set unique ID to Zero 
    } 
}; 

unsigned int Foo::foo_id_gen = 0; 

class FooPtr { 
public: 
    Foo* ptr; 
    unsigned int id; 
    explicit FooPtr(Foo* foo_obj_ptr) { 
     ptr = foo_obj_ptr; 
     id = foo_obj_ptr->id; 
    } 
    bool valid() { 
     return (ptr->id == id); 
    } 
}; 

int main() { 
    Foo* A = new Foo; 
    FooPtr APtrOjb(A); 
    printf("Is valid?: %s\n", APtrOjb.valid() ? "Valid" : "Not Valid"); 
    delete A; 
    printf("Is valid?: %s\n", APtrOjb.valid() ? "Valid" : "Not Valid"); 
} 

,它得到唯一的ID不能爲零,當對象被刪除時,析構函數將唯一ID設置爲零。然後,FooPtr類型的對象可以通過檢查id的匹配來檢查Foo類的對象是否仍然活動。

注意:我知道檢查ID不會100%授予結果,因爲當存儲器被分配用於其他目的時,匹配可能發生的可能性很小。因此,讓我們假設身份驗證方法可以得到加強,以保證100%的結果,這是一個可行的解決方案嗎?

有人建議這個問題類似於C++ delete - It deletes my objects but I can still access the data?,但他的問題是關於刪除數據,但我的問題是關於檢測對象是否已被刪除。

+0

可能重複的[C + +刪除 - 它刪除我的對象,但我仍然可以訪問數據?](http://stackoverflow.com/questions/1930459/c-delete-it-deletes-my-objects-but-我仍然可以訪問該數據) – Dukeling

+1

這是沒有解決方案。您正在嘗試重新創建'shared_ptr' /'weak_ptr'。當與'make_shared'一起使用時,內存佔用與您的類非常相似,但不會污染您的類。它也被證明是可行的,並且是合法的代碼。爲什麼不能使用'shared_ptr'的'std'或'boost'實現? – stefan

+0

@stefan,謝謝你將我從錯誤的設計中轉移出來...... – user1135541

回答

2

這是非常糟糕的,訪問被刪除的對象,如果他們沒有被刪除將在一般情況下崩潰。無法保證內存仍在映射進程內,並且可能導致虛擬內存頁錯誤。

這也可能是內存將被重新用於同一類的不同實例,所以它看起來是有效的,但它不是。

通常,這種設計會導致很難分析的錯誤。

您的測試程序範圍也非常有限。它不能說大型項目的行爲。

+0

這就是爲什麼ID會因每個實例而改變,所以第2段不是NA,但第1段是需要考慮的事情,但我沒有OS處理(無頁面錯誤),所以這是嚴格的C++問題。 – user1135541

+0

除非你真的自己編寫操作系統(在這種情況下,你可以做任何你想做的事情,因爲你負責系統上的所有內存),那麼你確實有一個操作系統來處理,即使它是一個操作簡單。 – Donnie