什么是 std::safe_string?
Posted
技术标签:
【中文标题】什么是 std::safe_string?【英文标题】:What is std::safe_string? 【发布时间】:2008-10-26 12:50:01 【问题描述】:answer to one of my questions 包含以下代码行:
label = std::safe_string(name); // label is a std::string
意图似乎是一个字符串文字的包装器(所以大概没有分配发生)。我从未听说过safe_string
,显然也没有google(我也无法在98 标准中找到它)。
有人知道这是怎么回事吗?
【问题讨论】:
【参考方案1】:在搜索google code search(我应该先想到这个...)之后,我发现了这个:
//tools-cgi.cpp
string safe_string (const char * s)
return (s != NULL) ? s : "";
它将NULL
s 转换为零长度字符串。虽然这不是标准的,但它可能是答案中提到的特定 STL 实现中的某种扩展。
【讨论】:
【参考方案2】:没有标准的安全字符串。您在该回答者的响应中看到的 safe_string 来自一个看起来像私有 STL 扩展实用程序库的东西。
Google for "stlext/stringext.h",您会在另一个论坛的帖子中看到相同的库。
【讨论】:
您的搜索结果不包括“safe_string”。【参考方案3】:没有std::safe_string
这样的东西
【讨论】:
【参考方案4】:它不是 C++ 标准的一部分(但也许应该是?)
我一直在使用同一种辅助函数来避免 std::string 抛出带有 NULL char * 字符串的异常。但它更像是:
// defined somewhere else as ""
extern const char * const g_strEmptyString ;
inline const char * safe_string(const char * p)
return (p) ? (p) : (g_strEmptyString) ;
没有开销,并且当我向它提供一个可能为 NULL 的 char * 字符串时 std::string 不会崩溃,但在这种特殊情况下,它应该表现为一个空字符串。
【讨论】:
使用 "" 创建一个 1 字节的文字对象。如果编译器不聪明,那么每个编译器都是不同的,因此可能会使代码膨胀。我怀疑编译器足够聪明,可以优化掉它,因此这是一个错误的增益并且使代码复杂化。 我对返回本地对象的指针或引用的想法感到不舒服,即使编译器可以正确处理每种情况(并使“”在返回中存活)。 实际函数返回一个std::string,所以返回一个指针没有问题,反正字符串字面量存储在程序的数据段中,所以它很明确地返回一个指向字面量的指针来自一个函数。 在这种情况下,你是对的。我的示例是更大的一部分:空字符串在其他地方被重用,其他全局常量对象也是如此(我有一个 global.hpp 和 global.cpp 源用于这些全局常量变量)。以上是关于什么是 std::safe_string?的主要内容,如果未能解决你的问题,请参考以下文章
jboss 错误:java.lang.NoSuchMethodError:org.hibernate.internal.CoreMessageLogger.debugf(Ljava/lang/Stri
Caused by: javax.el.PropertyNotFoundException: Property [userName] not found on type [java.lang.Stri
mybatis报错: java.lang.IllegalArgumentException invalid comparison: java.util.Date and java.lang.Stri