c++ Vector сам перезаписывает значения в нём

156
15 сентября 2019, 17:00

Только начинаю пробовать векторы и не понимаю почему в нем изменяется значения. Использую Qt 5.8.0.

В ходе for у vector'а сами перезаписываются значения

char *strS=new char[5];
std::vector <char*>yrus;
for(int i=0;i<10;i++){
    sprintf (strS, "%d", i+1);//Занести в char strR значения int i+1
    if(yrus.empty()){//Если вектор пустой занести strS
         yrus.insert(yrus.end(),strS);
    }
 }

При выполненииyrus.insert(yrus.end(),strS); заносит 1 в пустой вектор

Но потом значения yrus[0] меняются вместе с strS

Как исправить, чтоб в векторе оставалась "1" в ходе выполнения цикла for?

Answer 1

При добавлении в вектор (кстати, делайте это не с помощью insert, а push_back) у вас добавляется неизменный указатель strS, так что (все, если будут еще таковые) указатели в векторе одинаковы... А потом вы меняете содержимое в памяти в месте, куда он указывает. Еще раз - указатель остается тем же - меняется содержимое.

Вам надо или постоянно создавать новые указатели - типа

std::vector <char*>yrus;
for(int i=0;i<10;i++)
{
    char *strS=new char[5];
    sprintf (strS, "%d", i+1);//Занести в char strR значения int i+1
    yrus.push_back(strS);
 }

или, что лучше - работать со строками string.

std::vector<string> yrus;
for(int i=0;i<10;i++)
{
    yrus.push_back(to_string(i+1));
}

В этих вариантах у вас первым элементом будет С-строка (или строка string) "1", которая не будет изменяться. Но при использовании C-строк вы должны потом во избежание утечек памяти самостоятельно освободить память для всех элементов вектора. В случае string это будет сделано автоматически при выходе вектора из области видимости.

READ ALSO
Иконка Файла Visual C++

Иконка Файла Visual C++

Как изменить иконку файлаVisual Studio C++ 2017

132
Как отключить fpu в прерываниях?

Как отключить fpu в прерываниях?

Есть файл с обработчиками прерыванийВсе функции определены с атрибутом [[gnu::interrupt]]

160
Компьютерная графика, мягкие тени, Nvidia OptiX

Компьютерная графика, мягкие тени, Nvidia OptiX

Пытаюсь реализовать мягкие тени, как y Inigo Quilez (живой пример на shadertoy)

147
Ошибка при сборке boost

Ошибка при сборке boost

Выполнил/b2 installи в конце помимо всего прочего вывелось:

202