【问题标题】:Using a Constant Character Pointer in a std::set Container: Memory Consumption在 std::set 容器中使用常量字符指针:内存消耗
【发布时间】:2011-06-30 13:41:27
【问题描述】:

我目前正在使用内存很少 (4MB) 的设备,并且我的程序中有一个组件需要 std::set。我想将此集合从使用 std::string 迁移到使用 const char 指针,但我想知道在 std::set 中使用时如何将内存分配给常量字符指针。

当指针从集合中移除(通过使用 .clear() 或超出范围)时,分配给 std::set 的每个条目的内存是否会被释放,或者字符串文字是否会保留在内存中,直到程序执行结束?

非常感谢您的帮助。 :)

【问题讨论】:

  • 现在我们认为 4M 是一小部分内存真的很有趣。我记得整个操作系统可以容纳 8K 或更少(以及应用程序的一小部分)的日子。

标签: c++ pointers char memory-management stdset


【解决方案1】:

简而言之,不会发生什么特别的事情。

删除包含指向某些内存的指针的结构只会释放指针本身使用的内存;它不会导致指向的内存发生任何事情。

当然,除非你明确地调用free/delete。对于字符串文字,这不是一个好主意!

【讨论】:

  • 感谢您的快速回复! :) 你对替代解决方案有什么建议吗?有没有办法创建一组字符数组?
【解决方案2】:

STL 容器在清理时总是为它们包含的元素调用默认析构函数。对于一个持有原始‘char *’指针的集合,这将不会做任何事情并且内存将被泄漏。你自己负责清理ip这种内存。

因此,将原始指针存储在 STL 容器中通常被认为是不好的做法。

如果您确实必须使用其中包含原始 C 字符串的 STL 集,那很好,但请注意您必须自己回收内存。您还需要为该集合提供一个自定义比较器,以便通过值而不是指针比较存储的字符串('char *'s 上的默认排序只是比较指针,而不是字符串)。

【讨论】:

  • 如果 OP 真的是“字符串字面量”的意思,那么就不需要清理内存了。
  • @Oli Charlesworth- 同意,但由于没有明确提及,我不会假设它。但你是对的 - 如果它只是字符串文字,则不需要清理。
猜你喜欢
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 2012-08-04
  • 2014-09-02
  • 1970-01-01
相关资源
最近更新 更多