C++ 字符串 - 如何避免获取无效指针?

标签 c++ stl

在我们的 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/

相关文章:

c++ - 如果未满足某些条件,从方法返回什么?

c++ - 从任何地方访问头部 STL 列表

c++ - log(n) std::find_if 可能吗?

python - 如何从 Cython 中的 <algorithm> 外部

c++ - std::swap 只读引用的错误分配

c++ - 分配给 int 类型缓冲区的大内存大小

c++ - VLOG 不适用于 Google 日志记录库 (glog)

c++ - 在 C++ 文件中链接 mat.h

c++ - 网络包解析类设计

c++ - 如何通过正则表达式获取字符串中所有不匹配的范围?