class LinkTest{
public:
LinkTest(){
}
void start(){
List list;
Node * n ;
for(int i = 0; i < 5; i++){
//using pointer
// n = new Node(i);
// list.add(n);
//not using pointer
Node n(i);
list.add(&n);
}
list.displayAll();
}
};
class List{
public:
Node * first, *last;
List(){
first = last = NULL;
}
void add(Node *n){
if(first == NULL){
first = last = n;
}else{
last->next = n;
n->prev = last;
last = n;
}
}
void displayAll(){
while(first != NULL){
first->display();
first =first->next;
}
}
};
我有一些 Java 经验,但我是 C++ 的新手。我在这里做一个链表测试。
如果我使用指针,我将得到正确的输出(0 到 4)。但是,如果我不使用指针而只是像局部声明那样使用,输出就像无限大的 4。有人可以给我解释一下吗?
如果我是对的,局部声明“节点 n(i)”会将 n 放入堆栈,那么这是否意味着在下一个循环中 n 将被替换为新的 n(i+1)?或者只是 n(i+1) 将被添加到堆栈?为什么输出是一堆 4?
最佳答案
你在这里声明的对象
Node n(i);
是一个自动存储的本地对象,所以是的,它存在于栈中,更具体地说,存在于本地栈帧中。一旦局部范围结束,它就会不复存在,这是 for 循环的结束。
但是您获取该对象的地址并将其放入超出当前范围的列表中。该地址将继续指向堆栈中的某个位置,但不确定存储在那里的内容。
所以你看到的是未定义的不行为。
关于c++ - 声明对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12398824/