C++ 在C+中有方法吗+;确定字符串是否为;实习;还是在只读持久位置?

C++ 在C+中有方法吗+;确定字符串是否为;实习;还是在只读持久位置?,c++,C++,许多编译器和加载程序会将声明为“字符串”的字符串分配给只读持久内存段。是否有一种方法可以在运行时确定这一点,以便在需要持久性并且传递了“const char*”参数时不分配重复项?也为了防止释放他们。一般的答案是否定的。不是以便携的方式 因此,当(坏接口)函数返回静态或动态分配的内存时,实际上没有一种方法来区分两者之间的区别。例如: char* num_to_string(int number) { static char buffer[5]; if(number < 10

许多编译器和加载程序会将声明为“字符串”的字符串分配给只读持久内存段。是否有一种方法可以在运行时确定这一点,以便在需要持久性并且传递了“const char*”参数时不分配重复项?也为了防止释放他们。

一般的答案是否定的。不是以便携的方式

因此,当(坏接口)函数返回静态或动态分配的内存时,实际上没有一种方法来区分两者之间的区别。例如:

char* num_to_string(int number) {
    static char buffer[5];
    if(number < 10000) {
        std::sprintf(buffer, "%d", number);
        return buffer;
    }
    char* bigger_buffer = new char[50];
    std::sprintf(bigger_buffer, "%d", number);
    return bigger_buffer;
}
char*num到字符串(整数){
静态字符缓冲区[5];
如果(数量<10000){
std::sprintf(缓冲区,“%d”,编号);
返回缓冲区;
}
char*biger_buffer=新字符[50];
std::sprintf(更大的缓冲区,“%d”,数字);
返回较大的缓冲区;
}

当他有责任清理返回的内存时,使用上述函数将无法(不查看实现)。

您应该知道代码中明确分配了什么,并且您必须取消分配,任何其他情况都不需要使用
free()
delete
。如果你必须在运行时解释你自己的代码,你会遇到比这更大的问题。你可能想使用
std::string\u view
或其他函数来解释。注意-我在非标准程序中使用过此功能,其中有操作系统或特定于加载程序的实用程序来确定这些事情。在为符号键或内存有限的系统实现字符串插入等操作时,它非常有用。我的问题是,这些标准是否已经被移植到官方标准中。@peterk只需编写干净的代码,就可以让您不再为这些愚蠢的东西烦恼。我的具体使用案例是,我是否需要做一个strdup,或者使用std::string作为符号表中的键,或者只是将字符串放在映射中。如symbol=table.add(“symbolName”)@根据您的描述,我选择
std::string
,因为它处理自己的内存。使用
strdup
时,您始终负责返回的内存。是的,但在嵌入式系统符号表这样的情况下,不必重复内存使用,这很有用,因此问题是:)如果使用C++17,有一种称为
std::string_view
的手动替代方法可以重用内存。谢谢-我确实看过了:)