Вторая функция возвращает указатель, первая (в предположении 64-битной среды) возвращает значение в 24 байта (в соответствии с указателем size
+ capacity
+ start
).Когда компилятор компилирует клиентский код, он ожидает 24 байта и, вероятно, разыменовывает указатель start
.Но функция, которую вы связали, возвращает только 8 байт (указатель на std::string
), который нужно разыменовать дважды (один раз, чтобы получить std::string
, а затем разыменовать указатель start
).
Если бы start
было бы в первых 8 возвращенных байтах, ваш клиентский код предположил бы, что там находится строка data , но именно там лежат значения std::string
.Также было бы более или менее случайным, что возвращаемые size
и capacity
, и все было бы более или менее быстро взорваться.
И если бы start
не было бы в возвращенных 8 первых байтахкомпилятор попытается разыменовать size
, что, вероятно, является маленьким целым числом (возможно, 0).По сути, это всегда segfault.
На самом деле нет никакого способа, которым это может пойти правильно, даже в малейшей степени.Не нарушайте правила.
Это довольно неформальное объяснение, поскольку вы не указали, какую платформу / соглашение о вызовах и т. Д. Используете.Однако суть всегда одна и та же - возвращать ссылку (которая является просто указателем за кулисами) и значение, очевидно, несовместимо.Это как если бы вы ожидали, что пакет с едой полон, но вместо этого получил письмо, чтобы где-то забрать ваш пакет, поэтому вы начинаете есть письмо вместо того, чтобы сначала брать пакет - компьютеры такие «тупые».