如何判断const char *是否指向有效字符串?

时间:2010-09-06 22:29:07

标签: c++ memory-management

std::string str = "string":
const char* cstr = str.c_str();
str.clear();
//here, check if cstr points to a string literal.

在调试或发布模式下运行程序时,如何检查cstr是否仍指向字符串?

有没有办法在C ++中使用异常处理来确定这个?

3 个答案:

答案 0 :(得分:6)

没有可移植的方法来做到这一点。在调用clear()之后,实现完全可以自由地保持缓冲区,未经修改。如果,OTOH,clear()释放字符串的缓冲区,cstr现在指向未分配的内存,但即便如此,它还取决于内存分配器如何处理它。调试分配器将使用一些魔术数字填充块,如0xDEADBEEF,生产分配器可能保持不变,或者将整个页面返回给操作系统。

无论你剪切它的哪种方式,在字符串变异后使用c_str()返回的指针都是未定义的行为。故事结束。

答案 1 :(得分:2)

你不能。

在更改下划线字符串后,str.c_str()返回的指针不能保证以任何方式有效

例如,您可能在那里找到一个字符串,或者在那里找到一个空值,或者抛出访问冲突错误。

我怀疑你有没有理解这一点的代码,而你正在尝试测试访问该指针是否安全。 不是。

答案 2 :(得分:1)

无需检查任何内容。根据定义,它没有。一旦以任何方式修改字符串,c_str()的结果都无效。也许使用它一次不会崩溃,但下一次可能会崩溃。崩溃很少得到保证。

如果您想继续使用文字(特别是引用引号中的不可修改的字符串,"string"此处),请将其分配给单独的变量。

char const str_lit[] = "string";
std::string str = str_lit;
...