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

问题描述:

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

如何在调试模式或释放模式下运行程序时检查cstr仍指向字符串?如何判断const char *是否指向有效的字符串?

会有一种方法来确定这使用C++中的异常处理?

+1

你的问题是什么? – 2010-09-06 22:31:05

+0

是什么问题? – 2010-09-06 22:32:10

有没有便携的方式来做到这一点。在呼叫clear()之后,实现完全可以*地保持缓冲区,而不需要修改。如果,OTOH,clear()释放字符串的缓冲区,cstr现在指向未分配的内存,但即使如此,它也取决于内存分配器如何处理它。调试分配器会使用0xDEADBEEF等魔术数字填充该块,并且生产分配器可能会保持原样,或将整个页面返回给操作系统。

不论你如何切割它,在字符串被突变后使用c_str()返回的指针都是未定义的行为。故事结局。

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

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

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

你不能。

通过str.c_str()在不能保证有效在下属串之后的任何方式返回的指针已经改变。

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

我怀疑你有代码不明白这一点,你试图测试访问该指针是否安全。 不是。