std::string str = "string":
const char* cstr = str.c_str();
str.clear();
//here, check if cstr points to a string literal.
在调试或发布模式下运行程序时,如何检查cstr
是否仍指向字符串?
有没有办法在C ++中使用异常处理来确定这个?
答案 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;
...