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. Может кто-нибудь, пожалуйста, объясните мне это?
Если я прав, локальное объявление «Node n (i)» поместит n в стек, так значит ли это, что в следующем цикле n будет заменено новым n (i + 1)? или просто n (i + 1) будет добавлено в стек? и почему на выходе есть куча 4-х?
Объект, который вы объявляете здесь
Node n(i);
это локальный объект автоматического хранения, так что да, он существует в стеке, а точнее, в кадре локального стека. Он перестанет существовать, как только закончится локальная область действия, что является концом цикла for.
Но вы берете адрес этого объекта и помещаете его в список, который находится за пределами текущей области видимости. Адрес будет продолжать указывать на какое-то место в стеке, но будет не определено, что там хранится.
Так что то, что вы видите, не определено как поведение.
n
выходит из области действия при каждой итерации цикла, поэтому вы передаете адрес недействительного объекта в ваш список. Когда цикл завершен, и вы пытаетесь напечатать результаты, вы сталкиваетесь с неопределенным поведением, пытаясь получить доступ к этим (теперь недействительным) объектам.