Проблема доступа к векторной памяти в C ++

У меня есть вектор со списком команд, как показано ниже:

//COMMAND INITIALISATION
std::vector<std::string> objectInitialisationAction;
objectInitialisationAction.push_back("CREATE");              //0
objectInitialisationAction.push_back("END_CREATE");          //1
objectInitialisationAction.push_back("START_TIMELINE");      //2

Я только получаю доступ к этому вектору, используя мою функцию, показанную ниже:

int SearchFor(std::string search, std::vector<std::string> from)
{
int result=-1;
for(int i=0; i<from.size(); i++)
if(from[i]==search)
{
result=i;
break;
}
if(result == -1)
{
std::ofstream error("searching.txt");
error<<"search failed, original value = \""<<search<<"\""<<std::endl;
error<<"values in the table:"<<std::endl;
for(int i=0; i<from.size();i++)
error<<"value "<<i<<": "<<from[i]<<std::endl;
error.close();
}

return result;
}

Только с одним вызовом функции:

commandNum=SearchFor(command[0], objectInitialisationAction);

Это единственное место, где я получаю доступ к вектору, но когда я вызываю функцию в n-й раз (она всегда тормозит в одной и той же точке кода), она получает неверный доступ и выдает бессмысленный текст. Часть кода, который я перечислю ниже:

    search failed, original value = "CREATE"values in the table:
value 0: CREATE      Øç¼   Œ                      Ôç¼   Œ                      Ðç¼              Exit               ¼ç¼          ¸ç¼   Œ      p«üxðù   ;    ´ç¼   Œ      pëù@òø  €<    °ç¼   ŒBerlin Sans FB Demi e   ¬ç¼   ˆ°¿^nmra     œç¼   ŒBerlin Sans FB Demi e   ˜ç¼             help        ”ç¼   ˆ          object_dump ç¼             test        Œç¼   Ž          spawn       ˆç¼   ‹          load_map    „ç¼   Ž
//and so on...

Любые предложения относительно того, почему вектор может так испортиться?

0

Решение

Ваш код выглядит правильно для меня. В этом случае должна быть другая часть вашего приложения, которая портит память. Например, может быть доступ к массиву вне диапазона, висячий указатель или использование после удаления где-нибудь. Такие инструменты, как Valgrind, могут вам помочь.

1

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

Кажется, все правильно. Скомпилируйте и выполните это. Если все правильно, возможно, проблема в другой части вашего кода.

#include <iostream>
#include <vector>
#include <fstream>

using namespace std;int SearchFor(std::string search, std::vector<std::string> from)
{
int result=-1;
for(unsigned int i=0; i<from.size(); i++)
if(from[i]==search)
{
result=i;
break;
}
if(result == -1)
{
std::ofstream error("searching.txt");
error<<"search failed, original value = \""<<search<<"\""<<std::endl;
error<<"values in the table:"<<std::endl;
for(unsigned int i=0; i<from.size(); i++)
error<<"value "<<i<<": "<<from[i]<<std::endl;
error.close();
}

return result;
}

int main()
{

std::vector<std::string> objectInitialisationAction;
objectInitialisationAction.push_back("CREATE");              //0
objectInitialisationAction.push_back("END_CREATE");          //1
objectInitialisationAction.push_back("START_TIMELINE");      //2

for(unsigned int i=0; i<objectInitialisationAction.size(); i++)
{
cout<< objectInitialisationAction[i] << endl;
}

cout << "FOUND " << SearchFor("CREATE", objectInitialisationAction);

return 0;
}

Я предлагаю вам добавить using namespace std; в начале файла, поэтому вы не должны добавлять std::blablabla на каждом объявлении … ваш код будет более читабельным 🙂 и, пожалуйста …. INDENT IT 🙂

2

Код выглядит нормально, как есть. Наиболее вероятный сценарий для меня состоит в том, что поле длины ваших строк непреднамеренно перезаписывается, потому что команда, то есть фактические данные, все еще там. Просто строка думает, что она длиннее. (Перезаписывая персонажи не приведет к выводу, о котором вы сообщаете: команды будут перезаписаны, но длина строки все равно будет короткой.) Перезапись памяти обычно происходит через индекс массива или указатель, выходящий за пределы. Данные, на которые он указывает, должны иметь такую ​​же связь со строками (в вашем примере локальные или глобальные / статические).

Одной из стратегий поиска ошибок может быть периодическая печать длины строк элементов objectInitialisationAction; если они слишком длинные, вы знаете, что-то пошло не так.

Это может помочь закомментировать код, используя своего рода стратегию бинарного поиска (закомментируйте половину — высмеивая его функциональность, чтобы прога продолжала работать — и посмотрите, все ли еще происходит ошибка, затем снова разделите неисправную часть и т. Д.).

Обратите внимание, что вы передаете вектор по значению в SearchFor (), что, возможно, непреднамеренно. Повреждение может произойти на стороне вызывающего или вызываемого абонента, что должно быть легко проверить.

Надеялся, что помог.

0

попробуйте передать все параметры через const:

int SearchFor(const std::string& search, const std::vector<std::string>& from)
{
...
}
-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector