<p dir="ltr">Exactly. .data() returns just raw pointer. Each call to .toBase64() generates new buffer object. It's better to calculate it once and reuse.</p>
<p dir="ltr">const auto& base64 = picture.toBase64();<br>
const auto* ptr = base64.data(); // valid while base64 alive</p>
<br><div class="gmail_quote"><div dir="ltr">On пт, 25 авг. 2017 г., 7:52 Michael Pyne <<a href="mailto:mpyne@kde.org">mpyne@kde.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Thu, Aug 24, 2017 at 12:46:23PM -0400, Timothy Stoyanovski wrote:<br>
> Hello,<br>
><br>
> I'm having an interesting issue with 1 particular mp3. Below is my code:<br>
><br>
> TagLib::ID3v2::AttachedPictureFrame * frame =<br>
> (TagLib::ID3v2::AttachedPictureFrame *)(*it);<br>
><br>
> if (frame!=nullptr && frame->size() > 0) {<br>
><br>
>     auto len = frame->picture().toBase64().size();<br>
><br>
>     if (len) { // size: 741376<br>
><br>
>         outfile << "generated apic" << '\n';<br>
><br>
>         outfile << frame->picture().toBase64() << '\n';  // <—— is okay<br>
><br>
>         outfile << frame->picture().toBase64().data() << '\n'; <—— CRASH<br>
><br>
> Is there any way to identify why this crashes, and why does .data() cause<br>
> the crash?<br>
<br>
I can never get C++ lifetime rules fully memorized, but I think it is<br>
likely that the temporary ByteVector returned by<br>
frame->picture().toBase64() is deleted automatically in between the<br>
.data() call and the output to outfile.  That is, the compiler<br>
rearranges that crashing line to something like:<br>
<br>
{<br>
  // ...<br>
  const char * dataPtr;<br>
  {<br>
    const ByteVector vector = frame->picture().toBase64();<br>
    dataPtr = vector.data();<br>
  }<br>
  // vector destructed here, dataPtr not safe to use<br>
  outfile.operator<<(dataPtr); // crash<br>
}<br>
<br>
If you do something like<br>
<br>
        const auto &temp = frame->picture().toBase64();<br>
        outfile << temp.data() << '\n';<br>
<br>
and that works, then it's probably this issue.<br>
<br>
Regards,<br>
 - Michael Pyne<br>
</blockquote></div>