在下面的代码中,我们可以演示将小/大字符串保存在向量中时的错误(这是因为小字符串可能不会在堆上分配)。
有人可以说这不是标准库中的错误,而是程序员的错,因为它引用了在重新分配过程中可能消失的内容。但是作为程序员,我不应该知道数据结构的内部实现
#include<iostream>
#include<vector>
int main()
{
std::vector<std::string> v;
v.push_back("123456789abcdefg"); //bug if less than 16 characters
const char* first = v[0].c_str();
for (auto s : { "hi","guys" })
v.push_back(s);
std::cout << first << std::endl;
std::cin.get();
}
答案 0 :(得分:9)
但是作为程序员,我不应该知道数据结构的内部实现
您应该知道所使用的标准库中的数据结构iterator invalidation rules。它们是每个容器的公共合同的一部分,并且可以很容易地推断出何时可以使用对标准库容器中某些内容的迭代器/引用/指针,而不会产生不确定的行为。
这与其他语言中处理任何内容的其他接口没有什么不同。只要满足某些条件,该手柄才有效。
这并不是说C ++没有为您提供保护代码的工具。如果需要某些更精细的所有权语义,并且不同的容器具有不同的迭代器无效规则(由运行时或内存复杂性支付),则可以创建智能指针容器。