Изменение размера вектора при получении значения. Это правильно или может привести к segfault в любой ситуации? - PullRequest
0 голосов
/ 07 июня 2018

Если вы видите в приведенном ниже примере, я изменил размер вектора до размера 3, и я храню указатель data1 в данных [5]. Считаете ли вы это проблемой, если я не храню более 3 записей.

Это работает абсолютно безупречно, но правильный ли это подход?

#include<iostream>
#include <vector>

struct Data
{
 int age;
 int id;
};

int main()
{

 std::cout<<"inside main"<<std::endl;

 std::vector<Data*> data;

 data.resize(3);
 Data *data1 = new Data();
 std::cout<<"after resize"<<std::endl;
 data1-> age = 28;
 data1-> id = 5592;
 data[5] = data1;
 std::cout<<"after populate = ";
 std::cout<<data[5]->age<<std::endl;

return 0;

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Чтение данных [5] является неопределенным поведением, поскольку функция resize() изменяет размер вектора до 3. (допустимые индексы [0..2]).

Проблема сoperator[] это не бросает exception на недопустимый индекс.Если вы не уверены, является ли индекс действительным, рассмотрите возможность использования функции-члена .at(), которая проверяет наличие if(vector.size() <= index) // throw (имейте в виду, что выполнение функции немного медленнее из-за дополнительной проверки и выброса).Кроме того, если вы хотите поиграть, рассмотрите safe version of stl.

0 голосов
/ 07 июня 2018

A std::vector - это , а не - разреженный контейнер в том смысле, что вызов data.resize(3) позволяет назначить 3 элемента вектору с любым индексом по вашему выбору. Это не так.

Вы можете назначать только индексы 0, 1 и 2. Поведение при попытке доступа к data[5] равно undefined .

Похоже, что он работает в этом случае из-за того, что ваша библиотека времени выполнения C ++, возможно, выделяет пространство для большего количества элементов, чем 3, как полезная оптимизация для устранения фрагментации памяти.Возможно, вы могли бы сказать, глядя на емкость вектора.Но никогда не полагается на емкость, являющуюся верхней границей индекса, к которому вы можете получить доступ.

0 голосов
/ 07 июня 2018

Это неопределенное поведение.Вы пишете в память, которую вы не распределили.data не владеет прошлым data[2].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...