LINUX.ORG.RU

SIGSEGV в с++-проге

 ,


0

1

Помогайте, местные гуру C++!

Есть код

auto get_freqs(const std::string& ctext, const int key_len, const int start_pos)
{
	std::vector<int> count(256, 0);
	std::vector<double> ret(256);

	for (int i = start_pos; i < ctext.size(); i+= key_len)
		count[ctext[i]]++;

	std::transform(begin(count), end(count), begin(ret),
		[key_len, &ctext](auto c){ return (double)c * key_len / ctext.size(); });

	return ret;
}

auto get_freqs(const std::string& ctext, const int key_len)
{
	std::vector<std::vector<double>> ret;

	for (int i = 0; i < key_len; i++)
		ret.push_back(get_freqs(ctext, key_len, i));

	return ret;
}

При вызове функции с тремя параметрами всё ок, функция с 2-мя параметрами выдаёт сегфолт.

Чуть-чуть тыкал gdb, он говорит что сегфолт во free(), в backtrace что-то про std::allocator<int> написано.

Первым параметром передаю локальную переменную std::string. Самое забавное что при передаче строки (get_freqs(«azaza», 2);) никаких сегфолтов.

Ответ на: комментарий от i-rinat

Помогло, спасибо.

В прошлой версии кода я использовал vector<unsigned char> вместо string и скопипастил тот код.

SystemD-hater
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.