0

我有点困惑如何char *在内存中处理集合或结构的 a ,即管理内存的责任是什么。我听说一般来说,当你有string可用的类时,依赖资源管理和指针是不明智的。

std::tr1::unordered_map<char*, Vars> elements;

或者

struct example{
 char*name;
}

如果您在技术上传递一个指向字符数组的指针,那么这意味着“拥有”集合或结构不管理该文本的内存,而只是一个指向它的指针。那么该文本是否有可能从内存中消失并且指针悬空?

例如:

char * text="yo";
example myStruct;
myStruct.name=text; // how safe is this?
4

3 回答 3

4

裸指针编码有关解除分配的所有权/责任的任何信息。这完全取决于指针 /struct的来源。这正是std::string存在智能指针和类的原因。

至于例子,

char * text="yo";

这已被弃用,它与内存分配无关。使用 achar const*指向文字。这个字符串不可能在一个表现良好的程序中消失;最有可能的是,它存在于只读存储器中。

于 2013-04-03T14:19:58.050 回答
2

管理内存的责任是什么

这很简单——原始指针从不管理内存。它只是告诉您对象在内存中的位置。

那么该文本是否有可能从内存中消失并且指针悬空?

当然,这就是为什么你应该尽可能避免使用原始指针,并且在使用时要小心。

如果您需要对对象的“拥有”引用,则使用智能指针或容器来管理对象的生命周期。如果您需要“非拥有”引用,则要么使用类似的东西std::weak_ptr,要么仔细安排事物,以便在该引用仍在使用时不会破坏对象。

您的最后一个示例很好,因为指针指向"yo"字符串文字。这一直持续到程序结束,因此指针永远不会悬空。(尽管值得指出的是字符串文字是常量,所以你不应该使用非const指针来引用它,即使出于奇怪的历史原因该语言确实允许你这样做)。

于 2013-04-03T14:27:32.267 回答
1

在您的特定情况下,您不是分配内存,而是指向程序只读部分中包含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那么这很好。只要确保之后触摸指针,因为它可能会触发未定义的行为。

于 2013-04-03T14:22:07.583 回答