克服C++中错误的内存分配

0 c++ memory-management stl

在C++程序中,我写道:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
   vector<int> a;
   a.resize(1); 
   for( int i = 0 ; i < 10 ; i++ ) {
       cout << a[i] << " ";
   }

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

此程序打印[0]的正确值(因为它已分配),但也会在10个位置的其余位置打印值,而不是给出分段错误.

如何在编写代码时克服这个问题?当您的代码计算某些内容并愉快地访问不应访问的内存时,这会导致问题.

Kay*_*Ess 13

用这个:

a.at(i)
Run Code Online (Sandbox Code Playgroud)

at()out_of_range如果索引超出范围,将抛出异常.

operator []不进行边界检查的原因是效率.您可能希望习惯使用at()索引到向量,除非您有充分的理由不在特定情况下.

  • 这是一种解决错误编写代码的方法.您可以改为正确编写代码 - 使用size()或迭代器. (3认同)
  • 不同意.应该审查没有经验的编码员,而不是放在带衬垫的牢房里. (2认同)

sha*_*oth 10

当你调用resize()时,向量实现将缓冲区重新分配到足以存储所请求数量的元素的大小- 它不能少于你需要的但是实现可以自由地使它更大以减少内存碎片并减少重新分配经常.

避免此类错误的唯一方法是仅在代码中的有效索引范围内循环.对于您提供的代码,可以执行以下操作:

for ( int i = 0 ; i < a.size(); i++ ) {
    cout << a[i] << " ";
}
Run Code Online (Sandbox Code Playgroud)


lha*_*hne 5

您可以使用迭代器完全避免此问题.然后for循环看起来像

for(vector<int>::iterator i = a.begin(); i != a.end(); ++i)
    cout << *i << " ";
Run Code Online (Sandbox Code Playgroud)