@Rinsewind

Куда исчезает строка?

class CFListElement {
  public:

    String Name;
    CFListElement *Next;

 
    CFListElement(String name) {
      Name = name;
    }
};
class CFuncLibrary {
  public:
    CFListElement *root;
    CFListElement *last;

    void Add(String name) {

      CFListElement T(name);
      if(!last) {
        root = &T;
      } else {
        last->Next = &T;
      }
      last = &T;
      
      Con.print("'"+last->Name+"' = {"+String((long)&(last->Name))+"}"); //Строка на месте
    }
   CFListElement *Search(String Name) {
      CFListElement *T = root;
      Con.print("'"+last->Name+"' = {"+String((long)&(last->Name))+"}"); //Строки нет
    }
}


В чём может быть дело?
  • Вопрос задан
  • 55 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
В чём может быть дело?

Дело может быть в чём угодно, потому что ты привёл кусок кода, но не написал, как ты его используешь, что в одном случае строка есть, а в другом -- нет.

Но я могу посмотреть в свой магический шар и сказать, что в строке root = &T; в функции Add ты присвоил указателю адрес временного объекта, который был разрушен после выхода из этой функции. Поэтому, если ты сначала вызываешь Add, то строка есть, потому что объект на стеке жив, а если ты потом вызываешь Search, то строки нет, потому что объект разрушен, неопределённое поведение, и возможно программа падает через раз.

Можно заменить CFListElement T(name); на CFListElement *T = new CFListElement(name); и поправить & / * дальше по коду, чтобы убедиться, в этом дело или нет. После чего разобраться со временем жизни объектов и переписать всё как следует.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы