【发布时间】:2014-05-27 00:26:20
【问题描述】:
在我们的 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();
在这里,我们也使用了一个指向解除分配位置的指针。
这些问题在测试过程中不容易发现,因为内存位置仍然包含有效数据(尽管内存位置本身是无效的)。
我想知道您是否对我如何修改类/方法定义以使开发人员永远不会犯这样的错误有任何建议。
【问题讨论】:
-
这里也有类似的讨论:stackoverflow.com/questions/10540157/…
-
解决方案是让开发者在调用
c_str()之前慎重考虑,不要在代码中使用char *。也许您可以回顾一下他们为什么在代码中使用指针而不是仅使用字符串,并建议其他解决方案。