簡體   English   中英

在結構或集合中使用char *

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM