我使用vector作为缓冲区来存储一些对象,以便稍后附加到另一个向量。
std::vector<Link*> buffer_vector;
std::vector<Link*> main_vector;
main_vector.insert(main_vector.end(),buffer_vector.begin(),buffer_vector.end());
重复填充缓冲区和追加的过程。因此,我需要在每次迭代时清除缓冲区。我担心的是,如果我使用.erase或.clear方法清除缓冲区,主矢量中的对象将被删除。这个假设是否正确? 如果是,是否有解决方法?
谢谢
瓦赫德
答案 0 :(得分:2)
您的担忧是不正确的。
main_vector.insert(main_vector.end(),buffer_vector.begin(),buffer_vector.end());
将<{1}}中的元素复制到buffer_vector
。
这些复制的元素与原始元素完全分开,因此它们不会受到复制元素修改的影响。
答案 1 :(得分:1)
如果您要清除buffer_vector
将清除main_vector
中的内容,则不会是单独的副本。
答案 2 :(得分:1)
通过复制插入载体。换句话说,您正在将元素的副本推送到新的向量中。清除缓冲区向量时,将删除不同的副本。
(这假设您将相同的类型推入两个向量中,而不是像第一个向量中的向量到第二个向量中的元素指针那样。)
答案 3 :(得分:1)
您正在将元素复制到矢量中,它们会一直存在,直到您删除它们为止。
答案 4 :(得分:1)
在您显示的代码中,您将指针存储到对象中。指针将被复制,当原始向量为clear
或元素erase
d时,分配的内存不会发生任何事情。
实际上当第二个向量超出范围时,指向的内存不会发生任何事情!你的程序泄漏内存,你需要手动管理指针或者选择一个你可以在向量中使用的适当的智能指针(考虑来自C ++ 11的std::unique_ptr
或std::shared_ptr
或来自boost的等价物或TR1)。
答案 5 :(得分:1)
您可能会对vector
如何管理其对象感到困惑。当您push_back
进入矢量时,您可以制作副本。当你push_back
指针时,它会复制指针。当您调用clear()
或erase()
时,它会删除指针,但不会删除指针所指向的对象。
我假设您new
已编辑了所有Link
个对象,并将其添加到vector
容器中。您将需要自己删除它们,容器不会为您销毁指向的对象(即使容器本身在超出范围时被销毁)。如果您在所有clear()
对象上调用delete
之前Link
两个容器,则会导致内存泄漏(假设您没有在其他地方保留指向Link
个对象的指针)