C 矢量内存访问问题

C++ vector memory access issue

本文关键字:访问 问题 内存      更新时间:2023-10-16

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

//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个调用该功能(总是在代码中同一点制动)时,它会访问错误并输出Gibberish。我下面列出的一些代码:

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

关于为什么向量可能会这样损坏的任何建议?

似乎都是正确的。编译并执行此操作。如果一切都正确,则可能是在代码的另一部分中。

#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 ...您的代码将更可读::)和请...。>

您的代码对我来说看起来正确。在这种情况下,您的应用程序中应该有另一部分破坏内存。例如,可能会有一个偏僻的阵列访问,悬挂的指针或某处使用后使用。诸如Valgrind之类的工具可能会在这里为您提供帮助。

代码看起来还不错。对我来说,最有可能的情况是,字符串的长度字段被无意间覆盖,因为命令(即实际数据)仍在那里。只是字符串认为它比这更长。(覆盖字符不会导致您报告的输出:命令将被覆盖,但字符串长度仍然很短。)覆盖内存通常通过阵列索引或指针进行界限。它指出的数据必须与字符串具有相同的链接(在您的示例中,本地或全局/静态)。

错误搜索的一种策略是偶尔打印objectInitialisationActionAction元素字符串的长度;如果他们太久了,您知道出现问题了。

使用一种二进制搜索策略来评论代码(评论一半 - 嘲笑它的功能以保持PROG运行的功能 - 并查看错误是否仍然发生,然后再次将故障的部分分开。)。

请注意,您通过值将向量传递到SearchFor()中,这可能是意想不到的。腐败可能发生在呼叫者或Callee方面,这应该易于测试。-

希望这有所帮助。

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

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