Объявление объектов

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-х?

0

Решение

Объект, который вы объявляете здесь

Node n(i);

это локальный объект автоматического хранения, так что да, он существует в стеке, а точнее, в кадре локального стека. Он перестанет существовать, как только закончится локальная область действия, что является концом цикла for.

Но вы берете адрес этого объекта и помещаете его в список, который находится за пределами текущей области видимости. Адрес будет продолжать указывать на какое-то место в стеке, но будет не определено, что там хранится.

Так что то, что вы видите, не определено как поведение.

1

Другие решения

n выходит из области действия при каждой итерации цикла, поэтому вы передаете адрес недействительного объекта в ваш список. Когда цикл завершен, и вы пытаетесь напечатать результаты, вы сталкиваетесь с неопределенным поведением, пытаясь получить доступ к этим (теперь недействительным) объектам.

0

По вопросам рекламы [email protected]