【问题标题】:When is the memory in the cpp vector deallocated?cpp 向量中的内存何时释放?
【发布时间】:2016-11-17 08:59:35
【问题描述】:

假设我在 a.cpp 中有一个函数 fooRead(void **data),它声明了一个“vector<FOO> x”并从文件中读取 100 个 foo 对象。假设我从“b.cpp”调用 fooRead,并使用 fooRead(&data); 传递对“void* data;”的引用

在 foo.cpp 我做 *data = x.data() 。现在,随着函数 fooRead 的结束,向量超出范围并被自动销毁。那么这是否意味着 b.cpp 中的数据指向我现在不应该使用的内存??

我对何时以及如何销毁向量(调用自动析构函数)感到很困惑。任何帮助都非常感谢。我被卡住了!

【问题讨论】:

  • 你能粘贴一些代码吗?我相信案例会更容易理解......
  • 请不要描述代码的作用。显示相关代码(不要将这解释为倾倒你的整个 100 行代码)
  • void **data 为什么? C++ 有一个非常好的类型系统。学习使用它会让你成为一个更好的 C++ 程序员。 std::vector 的析构函数在对象超出范围时被调用。就像所有其他析构函数一样。
  • @PiotrNycz:我正在从我们之前编码的遗传算法 C 库中调用一个 cpp 函数(外部 C)。有很多晦涩难懂的代码很难解释这个问题,而不会使阅读时间过长。
  • @Tim :因为我希望 b.cpp 中的数据指向 FOO 的实例。如果我传递了唯一的 var 数据,我最终会对 b.cpp 中的实际位置数据无所事事。请三思而后行

标签: c++ memory memory-management vector destructor


【解决方案1】:

是的,b.cpp 中的数据指向已释放的内存(永远不应使用已释放的内存)。根据cppreference,std::vector 析构函数

破坏容器。元素的析构函数称为 并且使用的存储空间被释放

所以当向量在 fooRead 结束时超出范围时,它的存储空间(data() 的输出)也会被释放。

【讨论】:

  • 如果我在文件 b.cpp 中将向量声明为全局变量会怎样?它会保留在所有计划的范围内吗?
  • @PrakharAgrawal 如果您想确定何时在全局范围内分配和取消分配内存,为什么不直接编写一个程序,这样您就可以看到自己了?
  • @Toppest.Of.Kek 嗨,我实际上试过这个。但是随后内存仍然具有释放向量之前的内容(因为存储内存只是告诉操作系统停止对其进行索引但不会将其清零)。我不知道我是否应该使用这个内存。在一个更大的程序中,我遇到了一个内存损坏的错误,我在定位时遇到了麻烦。所以我认为这可能是问题所在。
  • @PrakharAgrawal 您可以将向量设为 b.cpp 中的全局变量或静态变量。这两者都有一个问题,就是下次运行 fooRead 时,会覆盖原来的数据,使得它不是很线程安全,也不是很容易使用。 fooRead 可以简单地返回一个向量吗?
  • @SCFrench 不,它不能返回向量,因为 cpp 函数是从 C 库中调用的。我知道将其设为全局会在我下次调用该函数时覆盖数据,但你说它不是非常线程安全是什么意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
相关资源
最近更新 更多