如何判断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++中的异常处理?
答
有没有便携的方式来做到这一点。在呼叫clear()
之后,实现完全可以自由地保持缓冲区,而不需要修改。如果,OTOH,clear()
释放字符串的缓冲区,cstr现在指向未分配的内存,但即使如此,它也取决于内存分配器如何处理它。调试分配器会使用0xDEADBEEF等魔术数字填充该块,并且生产分配器可能会保持原样,或将整个页面返回给操作系统。
不论你如何切割它,在字符串被突变后使用c_str()
返回的指针都是未定义的行为。故事结局。
答
没有必要检查任何东西。根据定义,它没有。一旦字符串以任何方式被修改,c_str()
的结果是无效的。也许一次使用它不会崩溃,但下一次可能会。碰撞很少得到保证。
如果要继续使用文字(特别是指引号中的不可修改字符串,"string"
),请将其分配给单独的变量。
char const str_lit[] = "string";
std::string str = str_lit;
...
答
你不能。
通过str.c_str()
在不能保证有效在下属串之后的任何方式返回的指针已经改变。
例如,您可能会在那里找到一个字符串,或者在那里找到null,或者抛出访问冲突错误。
我怀疑你有代码不明白这一点,你试图测试访问该指针是否安全。 不是。
你的问题是什么? – 2010-09-06 22:31:05
是什么问题? – 2010-09-06 22:32:10