【问题标题】:using C++ vector as a buffer使用 C++ 向量作为缓冲区
【发布时间】:2012-04-04 14:08:02
【问题描述】:

我使用向量作为缓冲区来存储一些对象,以便稍后附加到另一个向量。

std::vector<Link*> buffer_vector;
std::vector<Link*> main_vector;
main_vector.insert(main_vector.end(),buffer_vector.begin(),buffer_vector.end());

填充缓冲区和追加的过程重复发生。因此我需要在每次迭代时清除缓冲区。我担心的是如果我使用 .erase 或 .clear 方法来清除缓冲区,主向量中的对象将被删除。这个假设正确吗? 如果是,是否有解决方法?

谢谢

没有

【问题讨论】:

  • 要格式化代码,选择它并按 Ctrl-K 或编辑器中的 {} 按钮。

标签: c++ vector append


【解决方案1】:

您可能对vector 如何管理其对象感到困惑。当您将push_back 放入向量中时,您会进行复制。当您push_back 一个指针时,它会复制该指针。当您调用 clear()erase() 时,它会删除指针,但不会删除指针指向的 object

我假设你 new'ed 所有你的 Link 对象并将它们添加到 vector 容器中。您需要自己删除它们,容器不会为您销毁指向的对象(即使容器本身在超出范围时被销毁)。如果您在对所有Link 对象调用delete 之前clear() 两个容器,您将导致内存泄漏(假设您没有将指向Link 对象的指针保存在其他地方)。

【讨论】:

  • 当我将第一个向量插入另一个向量然后 .clear() 第一个向量时,我会跟踪这些对象(稍后我将删除它们)任何其他内存链接的迹象可能存在?.
  • @rahman:如果你有指向所有对象的指针与数组中的指针分开,那么不,当你通过原始指针删除它们时应该没有内存泄漏(不在容器)。尽管请记住,一旦您通过任何指针别名删除对象,所有指向该对象的指针现在都无效。
【解决方案2】:

在您展示的代码中,您将指针存储到对象中。当原始向量为cleared 或元素erased 时,指针将被复制,分配的内存不会发生任何事情。

实际上,当第二个向量超出范围时,指向的内存不会发生任何事情!您的程序泄漏内存,您需要手动管理指针,或者选择可以在向量内使用的适当智能指针(考虑 C++11 中的 std::unique_ptrstd::shared_ptr 或 boost 或 TR1 中的等效项)。

【讨论】:

  • 如果这些指针指向永远不会被销毁的对象,程序只会泄漏内存。
  • @Mankarse:公平点,但由于问题明确询问主向量中的对象是否会被删除,我的假设是他希望当向量中的对象被删除超出范围。如果他期待它,我假设这些对象是从免费存储中分配的,并且从未明确地deleted
【解决方案3】:

您正在将元素复制到向量中,它们将一直保留在那里,直到您将它们删除。

【讨论】:

  • 指针与否,它们被复制了。
【解决方案4】:

你的担心是错误的。

main_vector.insert(main_vector.end(),buffer_vector.begin(),buffer_vector.end()); 复制 buffer_vector 中的元素到main_vector

这些复制的元素与原始元素完全分离,因此它们不受复制它们的元素的修改影响。

【讨论】:

    【解决方案5】:

    插入向量是通过复制完成的。换句话说,您将元素的副本推送到新向量中。当缓冲区向量被清除时,另一个副本将被删除。

    (假设您将相同的类型推送到两个向量中,而不是像指向第一个向量中的向量的元素的指针到第二个向量中。)

    【讨论】:

    • 哦,是的!这是一个指针向量。我正在更新我的问题。请稍后阅读
    • 不管元素是不是指针,vector::insert都会复制它们,所以操作是安全的。
    • 然后将复制指针。只需确保您删除指针一次且仅一次。该向量不会为您删除,只要您只从最后一个向量中删除指针,您应该没问题(假设每个指针都到达那里)。但是,如果指针指向堆栈分配的元素并且超出范围,您将遇到问题。
    【解决方案6】:

    如果您的意思是清除buffer_vector 将清除main_vector 中的内容,它们是单独的副本。

    【讨论】:

    • 这是一个指针向量。我正在更新我的问题。请稍后阅读
    • 指针仍然被复制 - 删除旧指针没有任何作用,复制的指针指向同一个对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多