C++ 使用C++;作为缓冲区的向量

C++ 使用C++;作为缓冲区的向量,c++,vector,append,C++,Vector,Append,我使用vector作为缓冲区来存储一些对象,以便以后附加到另一个vector std::vector<Link*> buffer_vector; std::vector<Link*> main_vector; main_vector.insert(main_vector.end(),buffer_vector.begin(),buffer_vector.end()); std::vector buffer\u vector; std::向量主向量; main_vecto

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

std::vector<Link*> buffer_vector;
std::vector<Link*> main_vector;
main_vector.insert(main_vector.end(),buffer_vector.begin(),buffer_vector.end());
std::vector buffer\u vector;
std::向量主向量;
main_vector.insert(main_vector.end(),buffer_vector.begin(),buffer_vector.end());
填充缓冲区和追加的过程重复进行。因此,我需要在每次迭代时清除缓冲区。我担心的是,如果使用.erase或.clear方法清除缓冲区,主向量中的对象将被删除。这个假设正确吗? 如果是,是否有解决方法

多谢各位


vahid

如果您的意思是清除
缓冲向量
将清除
主向量
中的内容,不,它们是单独的副本。

如果您的意思是清除
缓冲向量
将清除
主向量
中的内容,不,它们是单独的副本。

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


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

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


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

您的问题不正确

main_vector.insert(main_vector.end(),buffer_vector.begin(),buffer_vector.end())将元素从
缓冲区向量
复制到
主向量


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

您的担心是不正确的

main_vector.insert(main_vector.end(),buffer_vector.begin(),buffer_vector.end())将元素从
缓冲区向量
复制到
主向量


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

您正在将元素复制到向量中,并且它们将一直保留到删除它们为止。

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

在您显示的代码中,您正在将指针存储到对象中。指针将被复制,当原始向量为
清除
ed或元素
擦除
d时,分配的内存将不会发生任何变化


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

在您显示的代码中,您正在将指针存储到对象中。指针将被复制,当原始向量为
清除
ed或元素
擦除
d时,分配的内存将不会发生任何变化


实际上,当第二个向量超出范围时,指向的内存不会发生任何变化!!你的程序内存泄漏,你需要手动管理指针,或者选择一个合适的智能指针,你可以在向量中使用(考虑C++11中的
std::unique\u ptr
std::shared\u ptr
,或者boost或TR1中的等价物)。

你可能会对
向量如何管理其对象感到困惑。当你把你推回到一个向量中时,你就复制了一个。当您
向后推
指针时,它会复制指针。调用
clear()
erase()
时,会删除指针,但不会删除指针指向的对象


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

您可能会对
向量如何管理其对象感到困惑。当你把你推回到一个向量中时,你就复制了一个。当您
向后推
指针时,它会复制指针。调用
clear()
erase()
时,会删除指针,但不会删除指针指向的对象


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

哦,是的!这是指针向量。我正在更新我的问题。请在几分钟后阅读,不考虑元素是否为指针,
vector::insert
将复制它们,因此操作是安全的。然后将复制指针。只需确保删除指针一次且仅删除一次。向量不会为您删除,只要您只从上一个向量中删除指针,