#c
#c
Вопрос:
Моя программа читает память, к которой у меня нет доступа, я пробовал несколько инструкций отладки, но не смог найти, что я делаю неправильно. Код еще не завершен, так как я обнаруживаю нарушение доступа.
// Program to find the length of the longest repeating sequence in a string.
#include <iostream>
#include <string>
#include <string_view>
#include <map>
void longest_sequence(std::string_view s)
{
std::map<std::string_view, int> m;
for (size_t i = 0; i < s.size(); i )
{
for (size_t j = i; j < s.size(); j )
{
if (i == j)
{
m["" s[i]] ;
}
else
{
auto x = s.substr(i, j);
m[x] ;
}
}
}
for (autoamp; i : m)
{
std::cout << i.first << ' ' << i.second << 'n';
}
}
int main()
{
std::string s = "aabb";
longest_sequence(s);
}
Вывод:
a 1
aa 1
aab 1
ab 1
abb 1
bb 1
lsMSVC14.28.29333includexstring 2
sMSVC14.28.29333includexstring 2
Комментарии:
1.
auto x = s.substr(i, j); m[x] ;
substr
я полагаю, может вернутьсяnpos
. И вы используете это (-1) значение в качестве индекса.2. Вы пробовали valgrind memcheck? Помогал мне в большинстве случаев….
Ответ №1:
У вас есть отображение m
из string_view
в целые числа. string_view
не владеет памятью. Это относится только к одному. So m["" s[i]] =...
создаст строку, а затем m
будет иметь вид строки, указывающий на уничтоженную строку, ведущую к UB.
Вы также, безусловно, используете substr
неправильно. Второй параметр — это размер, а не местоположение.
Я считаю, что вы хотели написать:
for (size_t i = 0; i < s.size(); i )
{
for (size_t j = i 1; j < s.size(); j )
{
m[s.substr(i, j-i)] ;
}
}
Редактировать: с другой стороны, я полностью уверен, что m["" s[i]] =...
на самом деле делает, но это на 100% неправильно.