在结构或集合中使用char *

时间:2013-04-03 14:18:02

标签: c++

我有点困惑如何在内存中为集合或结构处理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?

3 个答案:

答案 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解除内存,那么这很好。只需确保之后触摸指针,因为它可能会触发未定义的行为。