C ++向量内存访问问题

时间:2014-03-07 10:26:05

标签: c++ memory vector corruption

我有一个带有命令列表的向量,如下所示:

//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...   

关于为什么矢量可能会像这样腐败的任何建议?

4 个答案:

答案 0 :(得分:2)

似乎都是正确的。编译并执行它。如果一切正确可能问题出在您的代码的另一部分。

#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:)

答案 1 :(得分:1)

您的代码对我来说是正确的。在这种情况下,应用程序的另一部分应该破坏内存。例如,可能存在超出范围的数组访问,悬空指针或某处的删除后使用。像Valgrind这样的工具可能会帮到你。

答案 2 :(得分:0)

代码看起来不错。对我来说最可能出现的情况是字符串的长度字段被无意中覆盖,因为命令(即实际数据)仍然存在。只是字符串认为它比那个更长。 (覆盖字符不会导致您报告的输出:命令将被覆盖,但字符串长度仍然很短。)覆盖内存通常通过数组索引或指针发出边界它指向的数据必须与字符串具有相同的链接(在您的示例中为local或global / static)。

错误搜索的一个策略是偶尔打印objectInitialisationAction的元素字符串的长度;如果它们太长,你就会知道出了什么问题。

使用一种二进制搜索策略注释掉代码可能会有所帮助(注释掉一半 - 嘲笑它保持程序运行的功能 - 并查看错误是否仍然存在,然后再将故障部分分开等等。 )。

请注意,您将按值传递给SearchFor(),这可能是无意的。腐败可能发生在呼叫者或被呼叫方,这应该很容易测试.--

希望帮助。

答案 3 :(得分:-1)

尝试通过const refs传递所有参数:

int SearchFor(const std::string& search, const std::vector<std::string>& from)
{
 ...
}