C++ multimap<int, vector<string>> 内存分配问题

Posted

技术标签:

【中文标题】C++ multimap<int, vector<string>> 内存分配问题【英文标题】:C++ multimap<int, vector<string>> memory allocation issue 【发布时间】:2013-12-13 23:58:16 【问题描述】:

我想知道如何解决这个问题,在退出 storeData() 后向量 (vec, vec2) 被破坏,这会导致 main() 中的分段错误。 我应该为每个向量(vec,vec2)分配内存吗?如果是这样,最好的方法是什么? 另外,我怎样才能删除它们? 谢谢。

#include <map>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

void storeData();

multimap<int, vector<string> > mypairs;

void storeData()

    vector<string> vec;
    vec.push_back("one");
    vec.push_back("two");

    vector<string> vec2;
    vec2.push_back("alpha");
    vec2.push_back("beta");

    mypairs.insert(make_pair(1, vec));
    mypairs.insert(make_pair(2, vec2));


int main(int, char**)

    storeData();

    string str;
    vector<string>::const_iterator it;
    multimap<int, vector<string> >::const_iterator res;
    res = mypairs.find(1);
    for(it = res->second.begin(); it < res->second.end(); it++) 
        str = *it;
    
    //use string str to do something else later...

【问题讨论】:

我在这段代码 sn-p 中看不到任何内存问题。也许问题出在代码的其他地方? 这个程序在 GCC 4.7.2 中没有段错误 您应该检查从mypairs.find(1) 返回的迭代器,以防它返回end() 迭代器。它在这种情况下有效,因此问题不在您显示的代码中,就像您昨天问这个问题时一样。 @Blastfurnace 谢谢。 【参考方案1】:

vecvec2会被复制到mypairs中,所以原来的对象是否被销毁也没关系。

您应该发布有关段错误的更多信息。

【讨论】:

iterator insert(const value_type& x),insert 会直接将引用发送到 mypairs 吗? @user3097451 标准库容器保存值而不是引用。该函数只是通过引用来避免不必要的复制。此外,该参数是一个 const 引用,因此如果它只插入引用,您将永远无法修改它,因为它是 const。 @DavidBrown 那么有没有办法重用向量中的字符串? @user3097451 重用是什么意思,哪些字符串在哪个向量中?如果您发布了一些显示您遇到的问题的代码将会很有帮助,因为您发布的代码看起来不错。

以上是关于C++ multimap<int, vector<string>> 内存分配问题的主要内容,如果未能解决你的问题,请参考以下文章

C++ multimap 查找指定的元素

c++ map、multimap基本用法是什么,下面这个代码看不懂

c++中multimap的问题

如何在 C++ 中在 int 和 pair 之间制作 unordered_multimap?

如何在 C++ 中声明和初始化 2d int 向量?

第二部分:编写两个函数来反转 vect<int> 中元素的顺序