2016-10-25 35 views
-4

有結構(類型)和函數,允許通過共享內存(shm_open和mmap)使用struct返回類型*。如果共享內存的指針爲空,則使共享內存的內容爲空C++

Type* type = openSharedMemory(); 

我想要的內容,如果共享內存空和聲明typeptr == nullptr應該在不創建但是openSharedMemory存儲過程返回true。 這可能嗎?

+2

或在C++ 11'type = nullptr'中。雖然聰明的指針會更好。在那裏你也可以調用'.reset()' – Hayt

+0

@KlasLindbäck它沒有效果。在這種情況下,鍵入== NULL是錯誤的。 – Padmelina

+2

@Hayt根本不清楚這裏需要一個智能指針。 – juanchopanza

回答

1

這不是指針的工作方式。

如果將指針設置爲null,則內存仍然保留在那裏,直到有人改變它爲止。即使內存中有0,這也可以意味着例如整數0。對於C++中的普通指針,對於共享內存也是如此。

你需要做的是讓內存「無效」。在C++中沒有這樣的標準,所以這個必須由你自己定義。

您在這裏有幾個選項。


一個是爲自己定義一個無效值並將數據設置爲該值。

E.g.如果你有一個int,但你知道你只在那裏存儲正數,你可以將它設置爲-1來標記爲無效(或最大/最小int,我想你明白了)。

然後你檢查,而不是指針

//in some header 
static const int INVALID_VALUE = -1; 

//some process 
type->shared_int = INVALID_VALUE; 

//somewhere else 
if(type->shared_int != INVALID_VALUE) //or whatever 
    //do stuff 

如果你在你的記憶定製的結構,你可以添加一個布爾標誌,它是否有效與否

struct Type 
{ 
    bool valid = true; //c++11 initialize to true 
    //other data members 
}; 

當您現在想要將內存標記爲無效時,只需將該成員設置爲false並檢查該內容。

//some process 
type->valid = false; 

//somewhere else 
if(type->valid) 
    //do stuff 

,則可以避免這些事情,如果你有對象,權屬清晰,當你使用普通的指針。

在進程間通信可能會有點複雜,所以你必須使用這樣的機制。

設計明智的做法是讓一個進程負責內存(分配和釋放)並確保其他進程已完成,或者在「刪除」時停止訪問內存。但是,這並不總是可能的。

+0

謝謝,我解決了我的問題。 – Padmelina

1

如果我沒有記錯了也沒用確實刪除了(typeptr),因爲我沒有alocate如果有新的()

不僅無益,反而很可能未定義的行爲。如果你幸運的話,程序會崩潰。

是否有可能使typeptr nullptr?

是的。您可以指定值:

typeptr = nullptr; 

它只能在同一個進程,我在那裏創建共享內存。

每個進程都有自己的內存,其中像typeptr這樣的對象存在。沒有其他進程可以訪問這些對象。將一個指針設置爲null不會影響任何其他指針。

確實,如果您要設置null的指針在創建共享內存的進程中,那麼只有該進程才能訪問指針,因此該進程必須設置該值...除非指針本身是在另一個共享內存塊中,我認爲並非如此。

我想,如果共享內存空,使內容

啊,尖銳的內容設置爲null是從設定指針空完全不同。您可以使用std::memset將共享內存設置爲全零。就像使用非共享內存一樣。

+0

它僅在創建共享內存的相同過程中起作用。我還需要在openSharedMemory這個內存中檢查它。 – Padmelina

+0

@Padmelina:這不是指針的工作原理。 –

+0

@ user2079303所以我有不同的指針,這隻能讓我使用共享內存中的數據?如果我在openSharedMemory進程中創建進程的空指針,我只能說所有數據都是0? – Padmelina