Closed. This question is off-topic。它当前不接受答案。
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
4年前关闭。
为什么什么都不做的功能会改变对象?
我有以下代码:
输出为:
我的问题是与SList无任何关系的函数
我认为这与价值传递有关。如果有人向我展示我无知所缺的要点,那将是很好的。
编辑:标题问题的答案将是。请看看答案。
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
4年前关闭。
为什么什么都不做的功能会改变对象?
我有以下代码:
void sample(SList a)
{
cout << "\nIn Function";
a.print();
}
int main()
{
srand(500);
int total = 10;
SList llist;
for(int i = 0; i < total; i++)
{
llist.add_head(rand() % 100);
}
llist.print();
llist.print();
sample(llist);
llist.print();
return 0;
}
输出为:
70 69 14 3 18 71 70 17 57 98
70 69 14 3 18 71 70 17 57 98
In Function
70 69 14 3 18 71 70 17 57 98
0 34365728 34365696 34365664 34365632 34365600 34365568 34365536 34365504 34365472
我的问题是与SList无任何关系的函数
sample
正在更改SList。怎么样了SList是一个单链表。我认为这与价值传递有关。如果有人向我展示我无知所缺的要点,那将是很好的。
编辑:标题问题的答案将是。请看看答案。
最佳答案
查看SList's
复制构造函数和析构函数。我的猜测是,复制构造函数对数据进行浅表复制,而析构函数将其删除。问题在于,在调用sample
时将调用复制构造函数,然后在sample
退出时将调用析构函数。有几种方法可以解决此问题。
您可以通过引用传递SList
。这将防止复制构造函数和析构函数被调用。
您可以在复制构造函数中深度复制数据。
另一种解决方案是让SList
将其数据存储为shared_ptr
而不是原始数据。
08-26 19:20