не может изменить размер c ++ std :: vector, который является переменной-членом класса

код (упрощенная версия)

(часть) определения класса:

struct foo {
std::vector<int> data;
foo(int a=0):data(a+1,0) {}
void resize(int a) {
data.resize(a+1,0);
}
}

a+1 часть, потому что я хочу data быть 1-индексированным, чтобы упростить некоторые операции.

в глобальном масштабе:

int k;
foo bar;

в main функция:

std::cin>>k;
bar.resize(k);

Позже в main функция, есть вызов другой функции-члена (в foo), который получает доступ к data, в результате чего segmentation fault (segsegv).

После отладки я обнаружил, что data.size() возвращает 0. Что очень неожиданно.

После очень долгого сеанса отладки я чувствую себя очень уверенным, что проблема заключается в resizeing, что не должно вызывать никаких проблем (в конце концов, из стандартной библиотеки!).

Постскриптум Не обвиняйте меня в том, что я помещаю что-либо в глобальную сферу или открываю доступ для учеников Я не пишу никакой «настоящей» программы, потому что я просто тренируюсь на соревновании по программированию.

1

Решение

После очень долгого сеанса отладки я чувствую себя очень уверенным, что проблема заключается в resize

Почти наверняка, что:

  1. Проблема не имеет ничего общего с resize(),
  2. У вас где-то есть ошибка, связанная с памятью (двойное удаление, неинициализированный / зависший указатель, переполнение буфера и т. Д.).

Проблема с ошибками, связанными с памятью, заключается в том, что они могут быть абсолютно бессимптомными до тех пор, пока неисправный код не нанес ущерб.

Моя рекомендация будет запускать вашу программу под valgrind (или, по крайней мере, покажите нам SSCCE это не работает для вас).

5

Другие решения

Следующее работает хорошо для меня

#include <vector>
#include <cstdlib>

struct foo {
std::vector<int> data;
explicit foo(int a=0) : data(a+1, 0) {}
void resize(int a) {
data.resize(a+1, 0);
}
};

int main() {
foo test_foo(1);

for (size_t i = 0; i < 1000; ++i) {
int a = std::rand() % 65536;
test_foo.resize(a);
if (test_foo.data.size() != a + 1)
return 1;
}

return 0;
}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector