访问从堆上的对象返回的 c_str()
得到垃圾值通常是由于以下几个原因:
c_str()
指向的是堆上对象的临时内存,当对象被销毁时,指向的内存也会被释放,导致返回的指针指向无效内存。c_str()
,而这个临时对象在表达式结束后被销毁,那么返回的指针就会指向无效内存。c_str()
,可能会导致数据竞争和不一致的结果。确保返回 c_str()
的对象在访问期间是有效的。可以通过以下几种方式来实现:
std::shared_ptr
或 std::unique_ptr
来管理对象的生命周期。#include <iostream>
#include <memory>
#include <string>
std::shared_ptr<std::string> getString() {
auto str = std::make_shared<std::string>("Hello, World!");
return str;
}
int main() {
auto ptr = getString();
std::cout << ptr->c_str() << std::endl; // 安全访问
return 0;
}
如果不需要直接操作原始字符串,可以直接返回字符串的副本。
#include <iostream>
#include <string>
std::string getString() {
return "Hello, World!";
}
int main() {
std::string str = getString();
std::cout << str.c_str() << std::endl; // 安全访问
return 0;
}
std::string_view
std::string_view
是一个轻量级的非拥有字符串视图,可以安全地访问字符串而不需要拷贝。
#include <iostream>
#include <string_view>
std::string_view getStringView() {
static std::string str = "Hello, World!";
return str;
}
int main() {
std::string_view view = getStringView();
std::cout << view.c_str() << std::endl; // 安全访问
return 0;
}
std::string_view
可以避免不必要的拷贝。通过以上方法可以有效解决访问从堆上的对象返回的 c_str()
得到垃圾值的问题。
领取专属 10元无门槛券
手把手带您无忧上云