Самый простой способ для меня при работе с iframes - использовать метод postMessage + событие onmessage
. Это позволяет легко общаться между iframe и родителем. Дополнительные примеры здесь: https://javascript.info/cross-window-communication#postmessage
Безопасно назвать методы временных переменных, но не безопасными возвратить символ* временной переменной для более позднего использования.
Этот символ* указывает на буфер, который будет скоро освобожден. После того как это освобождено, у Вас будет указатель на недопустимый регион в памяти.
Вместо этого возвратите станд.:: строковый объект.
Вам разрешают назвать методы на временных файлах, однако необходимо быть осторожны относительно объектного времени жизни - в частности, если у Вас есть функция, которая возвращается c_str()
обращенный временный файл std::string
, тот строковый объект будет уничтожен, когда функция возвратится.
Ваш код выше страдает от этой проблемы.
Сгенерированный указатель будет хорош столько, сколько временный файл все еще вокруг, который является обычно до конца выражения. Исключения - когда временный файл используется в инициализаторе (в этом случае, он длится, пока инициализация не закончена), или при привязке со ссылкой. Временный файл в функциональном операторе возврата длится до функциональных выходов (если не связано со ссылкой). После того как временное время жизни закончено, временный файл уничтожается. В этом случае это означает, что строковый деструктор работает, и поэтому память для символов освобождена. Другими словами, после того как значение возвращено, оно гарантировало недопустимый.
Вы могли передать саму строку назад, возвратив его как ссылку константы. Вы могли скопировать .c_str () к недавно выделенной памяти и пасовать назад это (как указатель или интеллектуальный указатель). Любой из тех работал бы.
Время жизни временных файлов покрыто разделом 12.2 из стандарта C++. Согласно стандарту, Вы возвращаете указатель на освобожденную память.
Струна до, возвращенная путем вызова c_str () на временном файле, будет допустима до следующего вызова к c_str () на временном файле, которого никогда не может происходить. Сам временный файл бродит вокруг в конец полного выражения, это - часть (оператор возврата).
Если Вы возвращали станд.:: строка, все было бы hunkydory, поскольку конструктор копии строки будет вызван в возврате, чтобы сделать копию. Если Вы возвращаете символ *, то все ставки выключены, поскольку от значения, которое Вы возвращаете, избавятся, когда функция выйдет. Это не имеет ничего конкретно, чтобы сделать с временным файлом, это - общая проблема, когда возврат символа * - предпочитает возвращать станд.:: строки вместо этого.