为什么函数什么都不做会改变对象?
我有以下代码:
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是一个单链表。
我认为这与传值有关。如果有人告诉我我无知的那一点,那就太棒了。
编辑:标题问题的答案是肯定的。请看看答案。
答案 0 :(得分:2)
查看SList's
拷贝构造函数和析构函数。我没有看到它们的猜测是复制构造函数生成数据的浅表副本,析构函数删除该数据。问题是在调用sample
时调用复制构造函数,然后在sample
退出时调用析构函数。有几种方法可以解决这个问题。
您可以通过引用传递SList
。这将阻止调用复制构造函数和析构函数。
您可以在复制构造函数中深度复制数据。
另一种解决方案是让SList
将其数据存储为shared_ptr
而不是原始数据。