код (упрощенная версия)
(часть) определения класса:
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. Что очень неожиданно.
После очень долгого сеанса отладки я чувствую себя очень уверенным, что проблема заключается в resize
ing, что не должно вызывать никаких проблем (в конце концов, из стандартной библиотеки!).
Постскриптум Не обвиняйте меня в том, что я помещаю что-либо в глобальную сферу или открываю доступ для учеников Я не пишу никакой «настоящей» программы, потому что я просто тренируюсь на соревновании по программированию.
После очень долгого сеанса отладки я чувствую себя очень уверенным, что проблема заключается в
resize
Почти наверняка, что:
resize()
,Проблема с ошибками, связанными с памятью, заключается в том, что они могут быть абсолютно бессимптомными до тех пор, пока неисправный код не нанес ущерб.
Моя рекомендация будет запускать вашу программу под valgrind
(или, по крайней мере, покажите нам SSCCE это не работает для вас).
Следующее работает хорошо для меня
#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;
}