C++向量内存访问问题

Posted

技术标签:

【中文标题】C++向量内存访问问题【英文标题】:C++ vector memory access issue 【发布时间】:2014-03-07 10:26:05 【问题描述】:

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

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

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

【问题讨论】:

您的代码在我看来是正确的。在这种情况下,应用程序的另一部分应该会破坏内存,例如通过访问无效的指针。 @anderas 无效指针是指指向与该向量无关但访问与该向量相同的内存的其他一些值的指针吗? 对。例如,某处可能存在超出范围的数组访问、悬空指针或删除后使用。 Valgrind 之类的工具可能会在这方面为您提供帮助。 @anderas 谢谢,你很可能是正确的,因为我在我的程序中处理了很多指针。这也可以解释我的程序的其他一些问题。如果你愿意,你可以发表你的评论作为答案,以便我接受。 【参考方案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...您的代码将更具可读性:) 请...缩进它: )

【讨论】:

【参考方案2】:

您的代码在我看来是正确的。在这种情况下,应用程序的另一部分应该会损坏内存。例如,某处可能存在超出范围的数组访问、悬空指针或删除后使用。 Valgrind 之类的工具可能会在这方面为您提供帮助。

【讨论】:

【参考方案3】:

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

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

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

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

希望对您有所帮助。

【讨论】:

【参考方案4】:

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

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

 ...

【讨论】:

虽然这通常是一个很好的建议,但它与问题无关。 (见 gior91 的回答。) iam agree, but this suggestion exclude possible codes 未来的问题

以上是关于C++向量内存访问问题的主要内容,如果未能解决你的问题,请参考以下文章

c++ 内存分配向量的指针

在 C++ 中访问列表向量的问题

调试模式下内存映射向量的读取访问冲突

C++ 函数返回一个向量/字符串,但不是一个数组

在for循环C ++之外访问向量[关闭]

C ++中未初始化的内存分配