29 Mart 2019 Cuma

std::string c_str() Metodu

Giriş
İmzası şöyle.
const charT* c_str() const noexcept;
Bu metod null terminated bir bellek alanı döner.

Açıklaması şöyle.
The pointer obtained from c_str() may be invalidated by:
  • Passing a non-const reference to the string to any standard library function, or
  • Calling non-const member functions on the string, excluding operator[], at(), front(), back(), begin(), rbegin(), end() and rend().
Prvalue std::string ve c_str() metodu
Bir metodun içindeki temporary std::string'den c_str() kullanarak bellek döndürmemek gerekir. Açıklaması şöyle.
data points to an internal of that object, so after the temporary ends you are left with a dangling pointer. Accessing it leads to Undefined Behavior.
Görsel olarak şöyle.
const char* data = get_data().c_str() ;
//                 ^~~~~~~~~~         ^
//                 this evaluates     |
//                 to a prvalue       |
//                                    temporary expires here
Doğru kullanım şöyle.
int main()
{
  const std::string& ref = get_data();
  const char* data = ref.c_str();
  std::cout << data << "\n";
  return 0;
}
Şu kod yanlış.
#include <iostream>

std::string get_data()
{
    return "Hello";
}

int main()
{
    const char* data = get_data().c_str();
    std::cout << data << "\n";
    return 0;
}
Şu kod yanlış.
const char *returnMsg(const char *msg)
{
  static std::string message;

  message = msg;

  return message.c_str();
}

int main(int argc, char *argv[])
{
  const char *msg1 = returnMsg("Hello world");
  printf("msg1 = %p\n", msg1);
  cout << msg1 << endl;

  const char *msg2 = returnMsg("Good bye");
  printf("msg2 = %p\n", msg2);
  cout << msg2 << endl;

  cout << msg1 << endl; //Burada msg1 artık geçersiz hale geliyor.

  return 0;
}

Hiç yorum yok:

Yorum Gönder