[英]Using char * in a struct or collection
我有點困惑,如何在集合或結構的內存中處理char *
,即管理內存的責任是什么。 我聽說,一般來說,當您擁有類似string
類時,依靠資源管理和指針是不明智的。
std::tr1::unordered_map<char*, Vars> elements;
要么
struct example{
char*name;
}
如果從技術上講是將指針傳遞給字符數組,則意味着“擁有”集合或結構不管理該文本的內存,而僅管理指向該文本的指針。 那么該文本是否有可能從內存中消失並且指針指向懸空?
例如:
char * text="yo";
example myStruct;
myStruct.name=text; // how safe is this?
裸指針不編碼有關釋放的所有權/責任的任何信息。 這完全取決於指針/ struct
來自何處。 這就是為什么存在智能指針和類(如std::string
。
舉個例子
char * text="yo";
不建議使用此方法,它與內存分配無關。 使用char const*
指向文字。 該字符串不可能在行為良好的程序中消失; 最有可能的是,它存在於只讀存儲器中。
管理內存的責任是什么
這很簡單-原始指針永遠不會管理內存。 它只是告訴您對象在內存中的位置。
那么該文本是否有可能從內存中消失並且指針指向懸空?
絕對是,這就是為什么您應該避免使用原始指針的原因,並且在執行操作時要小心。
如果需要對對象的“擁有”引用,請使用智能指針或容器來管理對象的生存期。 如果您需要“非所有者”引用,則可以使用類似std::weak_ptr
東西,或者仔細安排內容,以使在該引用仍在使用時不會破壞該對象。
您的最后一個示例很好,因為指針指向字符串文字"yo"
。 這一直持續到程序結束,因此指針永遠不會懸空。 (盡管值得指出的是,字符串文字是常量,所以即使出於某種奇怪的歷史原因,您也不應使用非const
指針來引用該字符串)。
在您的特定情況下,您不是在分配內存,而是指向程序的只讀部分中包含string
“ yo”的位置。 您不需要釋放此內存。
而如果你有
char * text= new char[10];
memset(text,0,10);
strncpy(text,3, "yo");
example myStruct;
myStruct.name=text; // how safe is this?
您將負責釋放text
使用的內存。 沒有“所有權”,如果您想使用struct
釋放內存,那么就可以了。 只需確保事后觸摸指針,否則可能會觸發未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.