【发布时间】:2018-12-05 10:37:13
【问题描述】:
我有一个简单的问题,但很遗憾我无法在网上找到答案。
const char* foo() const { return "foo"; }
这是 100% 安全的吗?
【问题讨论】:
-
定义“100% 安全”。
-
没有内存泄漏,内存违规,ub 基本上我不会做: Foo* fooFunction(){ Foo foo{};返回 &foo; }
我有一个简单的问题,但很遗憾我无法在网上找到答案。
const char* foo() const { return "foo"; }
这是 100% 安全的吗?
【问题讨论】:
这完全可以从 PoV 语言中接受。
没有任何类型的内存泄漏,因为没有分配。唯一构造的值是原始类型的结果指针,初始化为指向文字的位置。该函数返回的指针指向一个可以读取和使用的有效位置。
事实上,这个函数可以标记为constexpr,因为结果可以在编译时确定,任何使用它的程序都可以像直接使用字面量一样工作。
【讨论】:
const char* 作为地图中的键。该问题询问有关仅使用const char* 访问地图值的问题,并询问它是否总是安全的。 不是。
const char* 与从函数中返回它无关,恕我直言。正如您所指出的,这是一个不同的问题。
我不确定您所说的“100%”是什么意思。表达式是正确的,但请记住,调用者需要知道返回的指针指向的数组的长度。函数返回这个值并带有一些参数,或者调用者检查长度,但在这种情况下,函数必须保证数组以 NULL 结尾。
【讨论】:
'\0'结尾。例如,给定auto foo = "abc",foo 的类型为const char[4]
strlen()吗?
const char*。考虑例如std::cout operator<< 过载。并猜测如果这段代码不同,它会做什么;好吧,如果它不同,它的行为就会不同。照原样,没关系。