Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? 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