在我们的 C++ 代码中,我们有自己的字符串类(出于遗留原因)。它支持方法 c_str()
很像 std::string
。我注意到许多开发人员都在错误地使用它。我已将问题简化为以下行:
const char* x = std::string("abc").c_str();
从 std::string
上的析构函数在调用 c_str()
后立即被调用的意义上来说,这段看似无辜的代码非常危险。结果,您持有一个指向已释放内存位置的指针。
这是另一个例子:
std::string x("abc");
const char* y = x.substr(0,1).c_str();
在这里,我们也使用了一个指向解除分配位置的指针。
这些问题在测试过程中不容易发现,因为内存位置仍然包含有效数据(尽管内存位置本身是无效的)。
我想知道您是否对我如何修改类/方法定义以使开发人员永远不会犯这样的错误有任何建议。
最佳答案
代码的现代部分不应该处理这样的原始指针。
仅在向采用 const char*
的旧函数提供参数时才调用 c_str
。喜欢:
legacy_print(x.substr(0,1).c_str())
为什么要创建 const char*
类型的局部变量?即使你写了一个复制版本 c_str_copy()
你只会更头疼,因为现在客户端代码负责删除结果指针。
如果您需要将数据保留更长时间(例如,因为您想将数据传递给多个遗留函数),那么只需将数据始终包装在字符串实例中。
关于C++ 字符串 - 如何避免获取无效指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23879348/