Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;向量存储器存取问题_C++_Memory_Vector_Corruption - Fatal编程技术网

C++ C++;向量存储器存取问题

C++ C++;向量存储器存取问题,c++,memory,vector,corruption,C++,Memory,Vector,Corruption,我有一个带有命令列表的向量,如下所示: //COMMAND INITIALISATION std::vector<std::string> objectInitialisationAction; objectInitialisationAction.push_back("CREATE"); //0 objectInitialisationAction.push_back("END_CREATE"); //1 objec

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

//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;
}
这是我访问向量的唯一地方,但当我第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:创造出一个出口,一个出口,一个出口,一个出口,一个出口,一个出口,一个出口,一个出口,一个出口,一个出口,一个出口,一个出口,一个出口,一个出口,一个出口,一个出口,一个出口,一个出口,一个出口,一个出口,一个出口,一个出口,一个出口;"pùpùòùòø"柏林无FB数据中心"nmraœùø柏林无FB数据中心"帮助"对象"转储"测试"生成"负载"地图"
//等等。。。

关于向量为什么会这样损坏,有什么建议吗?

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

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

这似乎完全正确。编译并执行这个。如果全部正确,那么问题可能出在代码的另一部分

#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;
}
#包括
#包括
#包括
使用名称空间std;
int SearchFor(std::string搜索,std::vector from)
{
int结果=-1;

对于(unsigned int i=0;i您的代码在我看来是正确的。在这种情况下,应用程序中应该有另一部分损坏了内存。例如,可能存在数组访问超出范围、指针悬空或删除后在某处使用。Valgrind之类的工具可能会帮到您。

代码看起来很正常。最可能的场景是rio对我来说是无意中覆盖了字符串的长度字段,因为命令(即实际数据)仍然存在。只是字符串认为它比这个长。(覆盖字符不会导致报告的输出:命令会被覆盖,但字符串长度仍然很短。)重写内存通常是通过超出边界的数组索引或指针进行的。它指向的数据必须与字符串具有相同的链接(在您的示例中为本地或全局/静态)

bug搜索的一种策略是偶尔打印ObjectInitializationAction元素字符串的长度;如果它们太长,您就知道出了问题

它可能有助于使用一种二进制搜索策略注释掉代码(注释掉一半——模仿它的功能以保持程序运行——并查看错误是否仍然发生,然后再次划分错误部分等)

请注意,您将向量按值传递到SearchFor()中可能是无意的。损坏可能发生在调用方或被调用方,这应该很容易测试--


希望能有所帮助。

我觉得你的代码是正确的。在这种情况下,你的应用程序应该有另一部分会破坏内存,例如访问无效指针。@anderas的无效指针是指指向与此向量无关但访问与向量相同内存的其他值的指针吗?对。例如re可能是一个超出范围的数组访问、一个悬空指针或在删除某处后使用。像Valgrind这样的工具可能会对您有所帮助。@anderas谢谢,您很可能是正确的,因为我在程序中处理了很多指针。这也解释了我的程序的一些其他问题。如果您愿意,您可以将您的评论作为答案发布,以便我可以修改接受它。虽然这通常是一个好建议,但与问题无关。(参见gior91的答案)。我同意,但该建议排除了未来可能出现的代码问题
#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;
}