【发布时间】:2017-04-15 05:12:31
【问题描述】:
我正在尝试将指针列表的值复制到另一个指针列表中。当我删除第一个指针的分配时,值不会保留在第二个列表中。我知道这特别是因为它是一个指针列表,并且地址被复制而不是实际值。我想知道我将如何去做这件事。
以下是我的代码:
#include <iostream>
#include <list>
int main(int argc, char const *argv[])
{
std::list<int*> pointer_list;
std::list<int*> int_list;
int one, two, three, four, five;
one = 1;
two = 2;
three = 3;
four = 4;
five = 5;
pointer_list.push_back(new int(one));
pointer_list.push_back(new int(two));
pointer_list.push_back(new int(three));
pointer_list.push_back(new int(four));
pointer_list.push_back(new int(five));
for (std::list<int*>::iterator iterator = pointer_list.begin(), end = pointer_list.end(); iterator != end; ++iterator)
{
std::cout << **iterator << std::endl;
}
for (std::list<int*>::iterator iterator = pointer_list.begin(), end = pointer_list.end(); iterator != end; ++iterator)
{
int_list.push_back(*iterator);
}
for (std::list<int*>::iterator iterator = pointer_list.begin(), end = pointer_list.end(); iterator != end; ++iterator)
{
delete *iterator;
}
for (std::list<int*>::iterator iterator = int_list.begin(), end = int_list.end(); iterator != end; ++iterator)
{
std::cout << "INT_LIST_AFTER DELETE: " << **iterator << std::endl;
}
for (std::list<int*>::iterator iterator = pointer_list.begin(), end = pointer_list.end(); iterator != end; ++iterator)
{
std::cout << "LIST_POINTER AFTER DELETE: " << **iterator << std::endl;
}
return 0;
}
以下是输出:
1
2
3
4
5
INT_LIST_AFTER DELETE: 1469317922
INT_LIST_AFTER DELETE: 1469317925
INT_LIST_AFTER DELETE: 1469317928
INT_LIST_AFTER DELETE: 0
INT_LIST_AFTER DELETE: 5
LIST_POINTER AFTER DELETE: 1469317922
LIST_POINTER AFTER DELETE: 1469317925
LIST_POINTER AFTER DELETE: 1469317928
LIST_POINTER AFTER DELETE: 0
LIST_POINTER AFTER DELETE: 5
另外,我将如何删除最后一个元素?当我遍历列表时,条件 iterator != end 会阻止它,并且由于列表的性质,我不能使用 <=。
【问题讨论】:
-
为什么要存储指针?如果您只是在处理
ints,请使用它们并删除指针。 -
“我想知道我将如何去做这件事” - 如何去做 what ?您已经确定了问题所在。你有一个充满悬空指针的列表。所以..要么不使用指针,要么使用可以在列表之间共享的东西,比如
std::shared_ptr<int>而不是int*。 -
如果可能,我正在尝试实现一个指向另一个指针列表的深层副本。
-
所以根本不要使用指针。使用
std::list<int>。 -
@a-one,你得到一个深拷贝,因为人们通常会解释这一点,因为你将列表解释为列表 指针。指针值被复制。如果您希望第二个列表包含与第一个列表不同的指针,那么您需要为它们分配空间以指向并适当地初始化该空间。
标签: c++ pointers memory-management stl