#include <iostream>
class DangerousString {
private:
std::string data;
public:
DangerousString(const std::string& str) : data(str) {
std::cout << "DangerousString created: " << data << std::endl;
}
~DangerousString() {
data = "";
std::cout << "DangerousString destroyed: " << data << std::endl;
}
const char* getCStr() const {
return data.c_str();
}
};
void log(const char* str) {
std::cout << "Log message: " << str << std::endl;
}
int main() {
const char* danglingPtr = DangerousString("Hello, World!").getCStr(); // ❌ UB!
std::cout << "Before log call" << std::endl;
log(danglingPtr); // Висячий указатель передаётся в log()!
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgRGFuZ2Vyb3VzU3RyaW5nIHsKcHJpdmF0ZToKICAgIHN0ZDo6c3RyaW5nIGRhdGE7CnB1YmxpYzoKICAgIERhbmdlcm91c1N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSA6IGRhdGEoc3RyKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJEYW5nZXJvdXNTdHJpbmcgY3JlYXRlZDogIiA8PCBkYXRhIDw8IHN0ZDo6ZW5kbDsKICAgIH0KCiAgICB+RGFuZ2Vyb3VzU3RyaW5nKCkgewogICAgCWRhdGEgPSAiIjsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkRhbmdlcm91c1N0cmluZyBkZXN0cm95ZWQ6ICIgPDwgZGF0YSA8PCBzdGQ6OmVuZGw7CiAgICB9CgogICAgY29uc3QgY2hhciogZ2V0Q1N0cigpIGNvbnN0IHsKICAgICAgICByZXR1cm4gZGF0YS5jX3N0cigpOwogICAgfQp9OwoKdm9pZCBsb2coY29uc3QgY2hhciogc3RyKSB7CiAgICBzdGQ6OmNvdXQgPDwgIkxvZyBtZXNzYWdlOiAiIDw8IHN0ciA8PCBzdGQ6OmVuZGw7Cn0KCmludCBtYWluKCkgewogICAgY29uc3QgY2hhciogZGFuZ2xpbmdQdHIgPSBEYW5nZXJvdXNTdHJpbmcoIkhlbGxvLCBXb3JsZCEiKS5nZXRDU3RyKCk7IC8vIOKdjCBVQiEKICAgIHN0ZDo6Y291dCA8PCAiQmVmb3JlIGxvZyBjYWxsIiA8PCBzdGQ6OmVuZGw7CiAgICBsb2coZGFuZ2xpbmdQdHIpOyAvLyDQktC40YHRj9GH0LjQuSDRg9C60LDQt9Cw0YLQtdC70Ywg0L/QtdGA0LXQtNCw0ZHRgtGB0Y8g0LIgbG9nKCkhCn0K