【问题标题】:Returning char* form C++ function从 C++ 函数返回 char*
【发布时间】:2018-12-05 10:37:13
【问题描述】:

我有一个简单的问题,但很遗憾我无法在网上找到答案。

const char* foo() const { return "foo"; }

这是 100% 安全的吗?

【问题讨论】:

  • 定义“100% 安全”。
  • 没有内存泄漏,内存违规,ub 基本上我不会做: Foo* fooFunction(){ Foo foo{};返回 &foo; }

标签: c++ arrays char


【解决方案1】:

这完全可以从 PoV 语言中接受。

没有任何类型的内存泄漏,因为没有分配。唯一构造的值是原始类型的结果指针,初始化为指向文字的位置。该函数返回的指针指向一个可以读取和使用的有效位置。

事实上,这个函数可以标记为constexpr,因为结果可以在编译时确定,任何使用它的程序都可以像直接使用字面量一样工作。

【讨论】:

  • 这是正确的,但是我们仍然需要“100% 正确”的定义。我现在找不到问题,但这里有一个问题询问使用 const char* 作为地图中的键。该问题询问有关仅使用const char* 访问地图值的问题,并询问它是否总是安全的。 不是
  • @Fureeish 使用const char* 与从函数中返回它无关,恕我直言。正如您所指出的,这是一个不同的问题。
【解决方案2】:

我不确定您所说的“100%”是什么意思。表达式是正确的,但请记住,调用者需要知道返回的指针指向的数组的长度。函数返回这个值并带有一些参数,或者调用者检查长度,但在这种情况下,函数必须保证数组以 NULL 结尾。

【讨论】:

  • 字符串文字保证以'\0'结尾。例如,给定auto foo = "abc"foo 的类型为const char[4]
  • 您提出的观点虽然有效,但在这种情况下没有多大意义。字符串文字总是以空字符结尾,并且在 c-strings 上操作的字符串处理函数从不占用长度,而是直接建立它(或者有时他们根本不需要它)。
  • 我知道,但是函数的调用者不一定知道这个,它看到的只是一个指向内存的指针
  • 你听说过strlen()吗?
  • @JorgeJuanTorresQuiroga 几乎每个人都知道如何处理const char*。考虑例如std::cout operator<< 过载。并猜测如果这段代码不同,它会做什么;好吧,如果它不同,它的行为就会不同。照原样,没关系。
猜你喜欢
  • 2012-02-18
  • 2018-05-09
  • 1970-01-01
  • 2016-06-10
  • 2016-03-22
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
相关资源
最近更新 更多