为foo()中的map<int , std::vector<int>> m1分配局部变量向量,希望s1的值一旦超出范围就无法访问。 但事实并非如此。 看起来矢量中的元素存储在堆内存中,而局部变量s1存储在堆栈中。 当s1存储在map中时,它似乎分配了一个新的堆内存并将值复制到其中。 我的理解正确吗? 我在foo中打印每个矢量元素的地址,也在map中打印每个矢量元素的地址。

#include <iostream>
#include <map>
#include <set>
#include<vector>
using namespace std;


std::map<int , std::vector<int>> m1;

void foo(){
    vector<int> s1 = { 10, 20, 30, 40 };
    cout << "local var address: " << &s1 << "\n";
    cout << "Element address " << &s1[0] << "  " << &s1[1] << " "
         << &s1[3] << "  " << &s1[4] << "\n";
    m1[1] = s1;
}


int main() {
    foo();

    cout << "\nElement value and address in map:\n";
    for (auto it = m1[1].begin(); it != m1[1].end();it++) {
        cout << *it << " " << &m1[1][*it] << "\n";  
    }

    return 0;
}

output:

local var address: 0x7fff41714400
Element address 0xc07c20  0xc07c24 0xc07c2c  0xc07c30

Element value and address in map:
10 0xc08cc8
20 0xc08cf0
30 0xc08d18
40 0xc08d40

#1楼 票数:5

当您执行m1[1] = s1; ,您正在调用m1[1]赋值运算符 如果您点击该链接,则表示您正在调用第一个实例,cppreference描述为:

1)复制分配运算符。 用其他内容的副本替换内容。

(强调我的)

因此,您正在查看两个完全不同的向量和两个完全不同的项目集的地址。 比较它们没有任何意义。

#2楼 票数:1

std::map<int , std::vector<int>>

value_typestd::vector<int> 这意味着存储在地图中的每个项目都包含这样的矢量对象。

它不包含对矢量的引用或指向矢量的指针,它实际上是一个对象。

这意味着,如果您在地图外部创建矢量,并将其分配给地图元素,则必须将其移动或复制。

  ask by user1762571 translate from so

未解决问题?本站智能推荐:

4回复

即使超出范围,我也可以保留矢量数据

我来自C语言背景。 我曾经分配内存/数组,例如,将其发送到其他地方,并且指针停留在那儿,甚至在那之后,分配它的作用域也被破坏了。 现在,如果我对vectors进行同样的操作:初始化,请按引用传递它,然后将该引用保存在某个地方。 在最初创建了向量的初始方法之后,超出了范围,它会被销毁吗? 或由于指向它
1回复

矢量数据超出范围后将丢失

我正在一个项目中,在该项目中我使用前向列表和向量,并输出它们的值。 前向列表是Frame对象的列表,向量是Display对象的向量。 问题在于,在InsertFrame()创建对象之后,向量的值会丢失并实际上变成垃圾。 我可以在调试器中看到它在函数结束后立即发生,这使我相信它与变量超出范围
1回复

矢量超出范围,但为什么呢?

它说我的向量超出了 ArrayD 的范围。 但我不明白为什么。 其他一切都有效。 Is 表示向量在双 deez 后超出范围。 因此,它不会完全提升。 使用命名空间标准; 无效你好(); 无效的文件(); 双 x, y, z; 双P、B; 整数 E = 0; 双V[16]; 双 C[16]; 双D[
1回复

为什么矢量下标超出范围?

我正在尝试编写这个非常简单的加法程序进行练习。 它接受输入列表并将其存储在向量中。 然后,它从向量中抓取每个连续的元素并将其求和。 但是,当我编译并运行程序时,它可以正常工作,直到for循环开始运行,然后编译器停止并吐出向量下标超出范围的消息? 我做错什么了?
2回复

矢量订阅超出范围

我是C ++的新手,遇到了处理向量的问题。 我需要从另一个类访问在“GridClass”中声明的向量,所以我将向量声明为public并尝试填充它。 这是我的代码。 GridClass.h 在GridClass.cpp中; 我不能使用数组,因为大小是动态的,我只使用20进行调试。
4回复

矢量超出范围/范围检查

新用户在这里。 我一直在编写这个代码,它创建一个带有节点的网络,并使用随机数在它们之间创建边。 我将整个图形跟踪为矢量,每个条目是一个向量,表示其元素是其邻居的节点。 然后,它使用深度优先搜索来查找组件的数量,这些组件是图形的分离部分(我的计数变量)。 然后我将节点及其连接的邻居数输出到
1回复

调试错误-矢量下标超出范围-PCL

我得到一个'Debug assertion failed'错误消息,它在下面的代码片段中的两个打印件之间显示'vector subscript out of range'。 我在64位机器,Win7和VS2010上使用PCL 1.7.1。 问题是,这是随机发生的,我不知道该怎么做。 我如
2回复

为什么在这里出现矢量下标超出范围错误?

我正在创建某种rpg战斗,程序从.txt文件读取输入。 我创建了代码,但是当我想开始战斗时,它给了我错误矢量下标超出范围的信息。 谁能帮我解决这个问题? 非常感谢:)这是代码。 我包括了所有内容,以便您可以获取完整的上下文信息,但是我想认为主要的问题是主cpp中的while循环,如果您想