为 char[ ] 字段创建 getter 的安全方法

Secure way to create a getter for a char[ ] field

所以我在做作业,我必须使用 C 风格的字符串作为我 class 的字段。我正在尝试为其创建一个安全的 getter,但我不知道该怎么做。 我使用的字段:

char name[20];

到目前为止我尝试了这些东西:

char* Car::getName() {
    return &name[0];
}

^ 唯一有效但如果我是对的 returns 允许对其进行编辑的字段地址。

char* Car::getName() {
    char ret[20];
    strcpy(ret, name);
    return ret;
}

^另一种我试过但没有成功的方法

所以我想问一下创建这样的 getter 的正确方法是什么? (对不起,如果这是一个天真的问题,但我一生中没有使用过很多 C)

将 return 类型声明为 const char *,并使函数本身成为 const(以指示调用未更改对象)。调用者可以通过强制转换忽略它,但那是他们的事;这是为了正确性,而不是安全性。

const char* Car::getName() const {
    return &name[0];
}

它们将有一个指向 class 内部结构的指针,但明确指出该指针指向只读数据。

其他选项包括将其公开为您按需构建的 std::stringreturn std::string(name);,return 类型 std::string),或 returning某种指向动态分配内存的智能指针(在道德上等同于 returning std::string)。制作一个副本并 returning 一个哑指针(例如 return strdup(name);)是一个坏主意,因为现在你已经打开了内存泄漏的大门;调用者必须手动 free/delete 内存。