c++ - 将值从一个 vector 复制到另一个 vector (来自书籍)

标签 c++

考虑这段代码。

#include <iostream>
#include <vector>

using namespace std;


int main()
{
    vector <int *> test;
    vector <int *> v;
    int *a = new int;
    int *b = new int;
    *a = 1;
    *b = 2;
    v.push_back (a);
    v.push_back (b);
    for (int i = 0; i < 2; ++i)
    {
        int n = *v[i];
        test.push_back (&n);
    }
    cout << *test[0] << " " << *test[1] << endl;
    delete a;
    delete b;
    return 0;
}

问题的陈述是:

“给定这段代码,回答以下问题:

  1. 为什么“测试” vector 只包含 2?

  2. 我们如何更改 for 循环以正确复制(仅 for 循环内的代码)?”

我无法回答这些问题中的任何一个,因此不胜感激。

提前致谢。

最佳答案

该代码引入了悬挂指针。循环体如下所示:

{
    int n = *v[i];
    test.push_back (&n);
}

一旦循环体结束,局部变量 n 就失去作用域,因此指针 &n 现在是一个悬空指针。如果碰巧 test 只包含 2,那正是 undefined behavior 随机产生的结果。

如果您想“正确地”将数据复制到test,您可以将for 循环体更改为:

{
    int* n = new int;
    *n = *v[i];
    test.push_back (n);
}

请对“正确”持保留态度...

关于c++ - 将值从一个 vector 复制到另一个 vector (来自书籍),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16597231/

相关文章:

c++ - 如何解决 "Didn' t 在路径 : DexPathList in my native callback to Java 上找到类 "..."

c++ - 正确检测UNC卷是否在线

c++ - gSOAP DOM 解析器问题

c++ - 子类化 std::thread:构造函数中可变参数模板函数的问题

c++ - 有没有办法检查按钮是否被选中?

c++ - 我的引用变量发生了什么?

java - 在 C++ 和 Java 中声明对象

c++ - 读取dll文件中的文本文件

c++ - MFC框架中如何使用XML over HTTP实现双向通信

c++ - std::allocator 中的直接初始化与统一初始化