大佬教程收集整理的这篇文章主要介绍了c – 如何处理可能指向内部数据的参考论据?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
#include <algorithm> #include <iostream> #include <String> #include <vector> class RecentStringBuffer { public: const std::string & at(size_t indeX) { return v.at(indeX); } void add(const std::string & s) { // Remove any prevIoUs occurances v.erase(std::remove(v.begin(),v.end(),s),v.end()); // Prepend the new entry v.insert(v.begin(),s); // Truncate older entries v.resize(std::min<size_t>(v.size(),maxEntries)); } private: const int maxEntries = 10; std::vector<std::string> v; }; int main() { RecentStringBuffer r; r.add("A"); // r == [A] r.add("B"); // r == [B,A] r.add("C"); // r == [C,B,A] r.add(r.at(1)); // r == [B,C,A] one would assume? std::cout << r.at(0) << r.at(1) << r.at(2); // Prints "A C A" }
@L_874_8@个例子中,我们得到了一个令人惊讶的结果,但是如果v已经重新分配了,那么这个引用将被留在v的内存之外,这会更糟.在技术上,参考无论如何都是无效的,所以发生的是未定义的行为.
类似的情况显然会发生在全局变量而不是数据成员和指针而不是引用,但成员和引用通常会更安全,所以这似乎是一个更令人惊讶的陷阱.
现在,我不是问为什么会发生这种情况(我了解发生了什么)或如何解决(有几个明显的方法).我的问题与最佳做法有关:
>这个问题有没有名字?
谁负责担心这个问题?
>或者说另一种方式,错误在哪里在上面的应用程序?当单独查看时,似乎完全合理和有益于at()返回一个const引用和add()来接受一个.另一方面,如果调用者main()也应该更好地知道似乎并不公平,特别是考虑到引用可能会在问题发生之前通过多个@L_@R_489_11289@_18@传递.
>有没有一般的策略来注意和避免这样的结构?
标准库的一个例子是:
> std :: vector :: insert(const_iterator pos,InputIt first,InputIt last)被具体记录为说“如果第一个和最后一个是迭代器到* this的行为是未定义的”.
> std :: vector :: insert(const_iterator pos,const T& value)没有这样的文档,因此即使值指向向量的元素,它也必须工作. (这是确认by the committee).
以上是大佬教程为你收集整理的c – 如何处理可能指向内部数据的参考论据?全部内容,希望文章能够帮你解决c – 如何处理可能指向内部数据的参考论据?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。