lundi 1 janvier 2018

std vector does not throw out_of_range exception when accessing uninitialized elements

I read this tutorial

std::vector beginners tutorial

and also saw this question:

similar tpoic question

Yet, when I run my simple example I did not see the excepted results, which are --> an std::out_of_range exception is NOT thrown.

Did I misunderstand here something ?

The sample code I run is the following (the code run and terminates successfully, i.e.- no exceptions thrown):

#include <iostream>
#include <vector>

using namespace std;

class MyObjNoDefualtCtor
{
public:
    MyObjNoDefualtCtor(int a) : m_a(a)
    {
        cout << "MyObjNoDefualtCtor::MyObjNoDefualtCtor - setting m_a to:" << m_a << endl;
    }

    MyObjNoDefualtCtor(const MyObjNoDefualtCtor& other) : m_a(other.m_a)
    {
        cout << "MyObjNoDefualtCtor::copy_ctor - setting m_a to:" << m_a << endl;
    }

    ~MyObjNoDefualtCtor()
    {
        cout << "MyObjNoDefualtCtor::~MyObjNoDefualtCtor - address is" << this << endl;
    }

    // just to be sure - explicitly disable the copy ctor
    MyObjNoDefualtCtor() = delete;

    int m_a;
};


int main(int argc, char** argv)
{
    // create a vector and reserve 10 int's for it
    // NOTE: no insertion (of any type) has been made into the vector.
    vector<int> vec1;
    vec1.reserve(10);   

    // try to access the first element - due to the fact that I did not inserted NOT even a single 
    // element to the vector, I would except here an exception to be thrown.
    size_t index = 0;
    cout << "vec1[" << index << "]:" << vec1[index] << endl;

    // now try to access the last element - here as well: due to the fact that I did not inserted NOT even a single 
    // element to the vector, I would excpet here an excpetion to be thrown.
    index = 9;
    cout << "vec1[" << index << "]:" << vec1[index] << endl;

    // same thing goes for user defined type (MyObjNoDefualtCtor) as well
    vector<MyObjNoDefualtCtor> vec2;
    vec2.reserve(10);   

    // try to access the first element -  due to the fact that I did not inserted NOT even a single 
    // element to the vector, I would except here an exception to be thrown.
    index = 0;
    cout << "vec2[" << index << "]:" << vec2[index].m_a << endl;

    // now try to access the last element - here as well: due to the fact that I did not inserted NOT even a single 
    // element to the vector, I would except here an exception to be thrown.
    index = 9;
    cout << "vec2[" << index << "]:" << vec2[index].m_a << endl;

    return 0;   
}

Notes:

The sample code is compiled with -std=c++11 option.

Compiler version is g++ 5.4 (on my Ubuntu 16.04 machine).

Thanks,

Guy.

Aucun commentaire:

Enregistrer un commentaire