C++ const указывает на странное поведение

Class C {
 struct Something {
   string s;
   // Junk.
 }
 // map from some string to something.
 map<string, Something> map;

 // Some more code:
 const Something *Lookup(string k) const {
   const something *l = SomeLookUpFunction();
   cout << l;
   cout << &l->s;
   cout << l->s;
   return l;
  }
}

// Some Test file
const C::Something *cs = C::Lookup("some_key");
cout << cs;
cout << &cs->s;
cout << cs->s;

Странная вещь заключается в следующем:
* Для функции поиска:
0x9999999
0x1277777
some_string

* Для тестового кода
0x9999999
0x1277777
000000000000000000000000000000000000000000....

В тестовом файле он дает очень длинную строку нулей, но адреса совпадают. Есть идеи, что может пойти не так?

1 ответ

Решение

Поскольку вы не поделились кодом для функции SomeLookUpFunctionЯ должен догадаться, что вы возвращаете указатель на локальный объект типа Something, Это плохая идея, см. Аналогичный QA.

Чтобы начать исправлять свой код, вы должны начать с возврата простого объекта вместо указателя, как показано ниже:

 // Some more code:
 const Something lookup(string k) const {
   const something l = SomeLookUpFunction(); // return simple object
   cout << &l;
   cout << &l.s;
   cout << l.s;
   return l; // same object 
  }

Конечно, вы должны улучшить код, предоставив конструкторы копирования для типа something и даже улучшая свой map,

Другие вопросы по тегам