繁体   English   中英

变量超出范围后如何保留矢量值?

How vector value is retained after the variable goes out of scope?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

为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
2 个回复

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

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

(强调我的)

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

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

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

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

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

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

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

2 变量超出范围

我正在做一个响应式背景视频。 我有这个代码。 我正在使用grunt来编译我的代码等.Grunt的Jshint说我正在使用“scale”超出范围而我无法理解为什么。 有什么建议? ...

3 变量可能超出范围

尽管代码乍一看似乎有点沉重(可能仍然如此),但它很简单。 我要做的就是从JSON文件中读取一些数据(格式如下: ) ,然后将一些信息推送到一个数组中,该数组是从来自newsapi.org服务器之一的另一个JSON文件获得的。 我的问题可能是由于吊装引起的,但我不知道如何解决。 ...

4 通过延迟执行来保留超出范围的堆栈变量

我承认这个问题表明了关于堆栈和堆栈框架的许多可能的误解。 希望我在这里问一个适当的问题。 在C#中,如何处理类似于以下代码的堆栈框架和局部变量。 使这些情况变得有趣的是,StartTasks中的变量j和StartTasks2中的变量i都被Tasks使用,这些任务很可能在这些变量不再在作 ...

6 相同消息:矢量下标超出范围

我试图为我的论文项目兄弟使用Opencv进行眼动跟踪,但是每次遇到向量超出范围的问题时,我试图在代码中解决它,我创建了第二个向量,例如eyes1,但是它不起作用。 ,如果我用一只手闭上眼睛,这是否会导致框架阻塞或与该问题有任何关系?请大家,我相信您是最后一次更改,我会告诉我的老师:-)我希望我 ...

7 查找矢量下标超出范围的位置

我收到错误“向量下标超出范围”。 我知道这意味着我已经在向量中调用了不存在的索引。 但是如何找到令人讨厌的向量? Windows调试器似乎没有太大帮助。 ...

8 Angular:数据绑定组件变量超出范围后

我面临一个奇怪的问题。 请参考以下代码。 //页面级变量 以下是对服务器的调用:- 方法如下: 第二个呼叫获得了寻呼组件。 此调用在getDataFromServer() ; 修改版本: 现在分页组件可以工作了。 我无法理解为什么变量this ...

2018-05-23 20:40:58 1 45   angular
9 变量的类型超出范围

我偶然发现了一些我不理解并且找不到答案的奇怪行为。 使用SubClass1和SubClass2作为BaseClass子类,我可以使用以下方法: 在我看来, variable的两个声明在不同的范围内,并且根据发送给该方法的obj的实际类型, var将属于SubClass1或SubClas ...

10 变量超出范围React

我是React的新手,并且为Jupyter Widget创建了一个HelloWorld应用程序。 一切都按预期工作,但是,即使在渲染应用程序时可以在componentDidMount函数中访问view ,我也无法弄清楚为什么在clickHandler函数中无法访问变量view 。 是否view通过c ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM