Нарушение доступа к памяти

#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% неправильно.