在结构体或集合中使用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
释放内存,那么这很好。只是要确保之后触摸指针,因为它可能会触发未定义行为。
- 根据用户回答声明"Players"。用户选择玩家数量。播放器是结构体
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 包含 std::list 的结构体的 C++ 初始化
- 结构体和类的不同大小(),彼此具有相同的字段类型
- 如何使用结构体的向量数组?
- 如何使用结构体在C++中更改这些代码?
- 无法在 Mosquitto MQTT Broker 插件上访问结构体 mosquitto 的元素
- 我应该如何在C++中使用结构体解决输入失败的问题?
- Qsort() 比较结构体整数的总和
- 将 char*[] 从 C++ DLL 结构体传递到 C#
- P/在结构体中调用定义长度的C char*数组
- 如何在单独的头文件中定义结构体中的char*数组?
- 从结构体到char *的转换问题
- 初始化c++中的char* in结构体
- 在结构体或集合中使用char *
- 如何将结构体强制转换为char[]数组
- 如何从const char*转换为结构体
- 带char的Marshall结构体
- 为什么编译器不能像变量声明那样在结构体成员中设置 char[] = { .. } 的大小?