Действительно ли безопасно назвать методы временного объекта?

Самый простой способ для меня при работе с iframes - использовать метод postMessage + событие onmessage. Это позволяет легко общаться между iframe и родителем. Дополнительные примеры здесь: https://javascript.info/cross-window-communication#postmessage

9
задан Emiliano 6 December 2017 в 09:32
поделиться

4 ответа

Безопасно назвать методы временных переменных, но не безопасными возвратить символ* временной переменной для более позднего использования.

Этот символ* указывает на буфер, который будет скоро освобожден. После того как это освобождено, у Вас будет указатель на недопустимый регион в памяти.

Вместо этого возвратите станд.:: строковый объект.

13
ответ дан 4 December 2019 в 08:53
поделиться

Вам разрешают назвать методы на временных файлах, однако необходимо быть осторожны относительно объектного времени жизни - в частности, если у Вас есть функция, которая возвращается c_str() обращенный временный файл std::string, тот строковый объект будет уничтожен, когда функция возвратится.

Ваш код выше страдает от этой проблемы.

6
ответ дан 4 December 2019 в 08:53
поделиться

Сгенерированный указатель будет хорош столько, сколько временный файл все еще вокруг, который является обычно до конца выражения. Исключения - когда временный файл используется в инициализаторе (в этом случае, он длится, пока инициализация не закончена), или при привязке со ссылкой. Временный файл в функциональном операторе возврата длится до функциональных выходов (если не связано со ссылкой). После того как временное время жизни закончено, временный файл уничтожается. В этом случае это означает, что строковый деструктор работает, и поэтому память для символов освобождена. Другими словами, после того как значение возвращено, оно гарантировало недопустимый.

Вы могли передать саму строку назад, возвратив его как ссылку константы. Вы могли скопировать .c_str () к недавно выделенной памяти и пасовать назад это (как указатель или интеллектуальный указатель). Любой из тех работал бы.

Время жизни временных файлов покрыто разделом 12.2 из стандарта C++. Согласно стандарту, Вы возвращаете указатель на освобожденную память.

1
ответ дан 4 December 2019 в 08:53
поделиться

Струна до, возвращенная путем вызова c_str () на временном файле, будет допустима до следующего вызова к c_str () на временном файле, которого никогда не может происходить. Сам временный файл бродит вокруг в конец полного выражения, это - часть (оператор возврата).

Если Вы возвращали станд.:: строка, все было бы hunkydory, поскольку конструктор копии строки будет вызван в возврате, чтобы сделать копию. Если Вы возвращаете символ *, то все ставки выключены, поскольку от значения, которое Вы возвращаете, избавятся, когда функция выйдет. Это не имеет ничего конкретно, чтобы сделать с временным файлом, это - общая проблема, когда возврат символа * - предпочитает возвращать станд.:: строки вместо этого.

4
ответ дан 4 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: