我有点困惑如何在内存中为集合或结构处理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?
答案 0 :(得分:4)
裸指针不会编码有关取消分配的所有权/责任的任何信息。这一切都取决于指针/ struct
的来源。这就是智能指针和类std::string
之类的原因。
至于例子,
char * text="yo";
这是不推荐使用的,它与内存分配无关。使用char const*
指向文字。这个字符串不可能在一个表现良好的程序中消失;最有可能的是,它存在于只读存储器中。
答案 1 :(得分:2)
管理内存的责任是什么
这非常简单 - 原始指针永远不会管理内存。它只是告诉你对象在内存中的位置。
那么该文本是否可能从内存和指针悬空消失?
当然,这就是为什么你应该尽可能避免使用原始指针,并且在你这样做时要小心。
如果您需要对对象的“拥有”引用,则使用智能指针或容器来管理对象的生命周期。如果您需要“非拥有”引用,则可以使用std::weak_ptr
之类的内容,或者仔细排列,以便在该引用仍在使用时无法销毁该对象。
你的最后一个例子很好,因为指针引用了"yo"
,一个字符串文字。这将一直持续到程序结束,因此指针永远不会悬空。 (虽然值得指出字符串文字是常量,所以你不应该使用非const
指针来引用一个,即使语言确实允许你出于奇怪的历史原因这样做。)
答案 2 :(得分:1)
在您的特定情况下,您不是分配内存,而是指向程序的只读部分中包含string
&#34; yo&#34;的位置。你不需要释放这些记忆
而如果你有
char * text= new char[10];
memset(text,0,10);
strncpy(text,3, "yo");
example myStruct;
myStruct.name=text; // how safe is this?
您将负责释放text
使用的内存。
没有&#34;所有权&#34;,如果你想使用struct
解除内存,那么这很好。只需确保之后触摸指针,因为它可能会触发未定义的行为。