C++ 代码可能存在的问题

标签 c++

下面的代码有错误吗?

#include <vector>
#include <iostream>
#include <string>
#include <algorithm>
#include <functional>


int main()
{
  std::vector<std::string> myVector;

  myVector.push_back("one");
  myVector.push_back("two");
  myVector.push_back("three");
  myVector.push_back("four");
  myVector.push_back("five");

  std::sort(myVector.begin(),myVector.end(),std::less_equal<std::string>());
  std::string& str = myVector.back();

  std::cout << str << std::endl;

  std::vector<std::string>::const_iterator it = myVector.begin();

  myVector.push_back("six");
  myVector.push_back("seven");

  std::cout << *it << std::endl;

  return 0; 
}

我只能看到,通过将 vector 的最后一个元素的地址分配给 str ,这意味着如果删除该元素,则 str 为空,这可能会导致意外的行为,甚至运行时问题。

最佳答案

是的,问题出在这一行:

std::cout << *it << std::endl;

这是在几次push_back之后发生的。由于 vector 是可调整大小的,因此在保存迭代器和添加更多元素之间,容器可能必须分配更多内存。如果确实必须这样做,那么您的迭代器将指向不再是 vector 的一部分的元素。它可能看起来不太像,但你[可能]有一个悬空指针。

同样,与:

std::string& str = myVector.back();

该引用可能会在 push_back 之后失效。

关于C++ 代码可能存在的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26673995/

相关文章:

c++ - CMake 无法识别混合 C++/FORTRAN 程序中的 FORTRAN 源代码

c++ - 交叉编译问题

c++ - 随机高斯函数的时间复杂度

c++ - 在套接字编程中选择在 Windows 中挂起一段时间?

c++ - GetAsyncKeyState 不工作

c++ - 如何使鼠标移动没有延迟?

c++ - 结构和函数(通过引用传递)

c++ - nlohmann json将.at()方法用于索引 vector

c++ - QProperties 中的共享指针列表

c++ - 没有调用 mouseMoveEvent