函数调用会更改其参数

时间:2015-06-16 22:56:28

标签: c++

我有以下代码:

#include <iostream>

using namespace std;

template <class T>
class Iterator;

template <class T>
class List;

template <class T>
class List {
    public:
        struct Node;
        Node* first;
        friend class Iterator<T>;

        List() :
            first(NULL) { }

        Iterator<T> begin() {
            cout << first->data << endl;
            return Iterator<T>(*this, first); // <--- problematic call
        }

        void insert(const T& data) {
            Node newNode(data, NULL);
            first = &newNode;
        }
};

template <class T>
struct List<T>::Node {
    private:
        T data;
        Node* next;

        friend class List<T>;
        friend class Iterator<T>;

        Node(const T& data, Node* next) :
            data(data), next(next) { }
};

template <class T>
class Iterator {
    private:
        const List<T>* list;
        typename List<T>::Node* node;

        friend class List<T>;

    public:
        Iterator(const List<T>& list, typename List<T>::Node* node) {
            cout << node->data << endl;
        }
};

int main() {
    List<int> list;
    list.insert(1);
    list.begin();

    return 0;
}

首先,我将节点数据设置为&#34; 1&#34; (INT)。我只是将它传递给Iterator构造函数,但它更改了node->data的值。

我在通话前后打印node->data

1
2293232

我想2293232是某个地址,但我无法找到发生这种情况的原因。

1 个答案:

答案 0 :(得分:5)

写作时

lucky number

然后:

  1. 您在堆栈上创建对象

  2. 将一些(更多)持久性指针指向其地址

  3. 在范围超出范围时对其进行破坏

  4. 所以你留下了垃圾。