在结构体或集合中使用char *

Using char * in a struct or collection

本文关键字:char 结构体 集合      更新时间:2023-10-16

我有点困惑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释放内存,那么这很好。只是要确保之后触摸指针,因为它可能会触发未定义行为。