有結構(類型)和函數,允許通過共享內存(shm_open和mmap)使用struct返回類型*。如果共享內存的指針爲空,則使共享內存的內容爲空C++
Type* type = openSharedMemory();
我想要的內容,如果共享內存空和聲明typeptr == nullptr
應該在不創建但是openSharedMemory存儲過程返回true。 這可能嗎?
有結構(類型)和函數,允許通過共享內存(shm_open和mmap)使用struct返回類型*。如果共享內存的指針爲空,則使共享內存的內容爲空C++
Type* type = openSharedMemory();
我想要的內容,如果共享內存空和聲明typeptr == nullptr
應該在不創建但是openSharedMemory存儲過程返回true。 這可能嗎?
這不是指針的工作方式。
如果將指針設置爲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
,則可以避免這些事情,如果你有對象,權屬清晰,當你使用普通的指針。
在進程間通信可能會有點複雜,所以你必須使用這樣的機制。
設計明智的做法是讓一個進程負責內存(分配和釋放)並確保其他進程已完成,或者在「刪除」時停止訪問內存。但是,這並不總是可能的。
謝謝,我解決了我的問題。 – Padmelina
如果我沒有記錯了也沒用確實刪除了(typeptr),因爲我沒有alocate如果有新的()
不僅無益,反而很可能未定義的行爲。如果你幸運的話,程序會崩潰。
是否有可能使typeptr nullptr?
是的。您可以指定值:
typeptr = nullptr;
它只能在同一個進程,我在那裏創建共享內存。
每個進程都有自己的內存,其中像typeptr
這樣的對象存在。沒有其他進程可以訪問這些對象。將一個指針設置爲null不會影響任何其他指針。
確實,如果您要設置null的指針在創建共享內存的進程中,那麼只有該進程才能訪問指針,因此該進程必須設置該值...除非指針本身是在另一個共享內存塊中,我認爲並非如此。
我想,如果共享內存空,使內容
啊,尖銳的內容設置爲null是從設定指針空完全不同。您可以使用std::memset
將共享內存設置爲全零。就像使用非共享內存一樣。
或在C++ 11'type = nullptr'中。雖然聰明的指針會更好。在那裏你也可以調用'.reset()' – Hayt
@KlasLindbäck它沒有效果。在這種情況下,鍵入== NULL是錯誤的。 – Padmelina
@Hayt根本不清楚這裏需要一個智能指針。 – juanchopanza