Добро пожаловать в C ++!Вы обнаружите, что в этом столетии он немного изменился, и в лучшую сторону.
Объект "String log" живет только во время вызова addLog.Вы не можете вернуть log.c_str (), потому что это вернет висячий указатель на объект, который больше не будет существовать после возврата.Решение простое - просто верните сам «лог».Пусть эта функция (и GetMessageLog) возвращают не "char *" старого C, а современный "std :: string" C ++.
В старом C ++ возвращение std :: string из функции былочасто осуждают, потому что это всегда включает копирование этой строки, иногда несколько раз.Это больше не соответствует действительности с появлением конструкторов перемещения (которые, вероятно, являются наиболее важной новой функцией в C ++ 11).Функция создает строку, и при ее возврате строка не копируется, а скорее «перемещается», что включает в себя копирование только указателя, который она содержит, в свой массив данных, но не копирует сам массив.
Inв современном C ++ вы очень редко будете использовать голые указатели старого стиля, как в этом примере использовали char *.Обычно вы будете использовать объекты, такие как std :: string вместо char *, контейнеры, такие как std :: vector вместо int *, умные указатели, такие как std :: unique_ptr вместо T *.Все эти объекты безопаснее, чем простые указатели, потому что они дают вам меньше шансов испортить время жизни объекта и безопасны для исключений (т. Е. Если в середине кода возникает исключение, вы не забудете освободить его).память, которую вы выделили).