Giriş
İmzası şöyle.
Açıklaması şöyle.
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.
İ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().
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;
}