繁体   English   中英

C++ 中的指针向量

[英]Vector of Pointers in C++

我是 C++ 编码的新手,遇到了一个非常基本的问题。 下面的代码是该问题的一个最小示例。

基本上,我试图附加到一个指针向量。 在下面的代码中,所需的结果是向量中的三个不同的指针。 但是,每当我添加指向向量的指针时,它都会覆盖向量的所有条目以包含相同的指针。

我得到的输出是:

121
-500 -500
30 30 30

我想要的输出是:

121
121 -500
121 -500 30

这看起来真的很愚蠢,但我不知道如何解决它! 任何帮助,将不胜感激。

#include <iostream>
#include <vector>
#include <array>
#include <iterator>
#include <list>

static std::vector<std::array<int, 2> *> heap_array;

void insert_into_heap(int num){
    static std::array<int, 2> test;
    test[0] = num;
    heap_array.push_back(&test);
}

void print_heap(){
    std::vector<std::array<int, 2> *>::const_iterator it;
    for(it = heap_array.begin(); it != heap_array.end(); ++it){
        std::cout << (*(*it))[0] << " ";
    }
    std::cout << "\n";
}

int main(int argc, char** argv){
    insert_into_heap(121);
    print_heap();
    insert_into_heap(-500);
    print_heap();
    insert_into_heap(30);
    print_heap();
    return 0;
}

顺便说一句,与堆相关的命名在此阶段不相关。

解释

void insert_into_heap(int num){
    static std::array<int, 2> test;
    test[0] = num;
    heap_array.push_back(&test);
}

在此函数中,您将test声明为静态,这意味着它会在第一次调用该函数时创建此数组,并且仅在以下时间更新它。 当您将此测试的地址发送到您的堆时,您实际上每次都发送完全相同的地址。 假设这个test的地址在第一次调用中是0x1234 ,它会在所有其余的调用中保持这种方式。 所以,当你每次更新这个静态变量时,你实际上每次都会更新整个堆数组元素(因为它们都指向相同的内存位置)。

怎么解决?

您可以通过多种方式解决此问题。 我只是建议您在heap_array使用smart pointers ,并在insert_into_heap函数中使用make_shared / make_unique ,这样您将在堆上创建一些真正的新内存位置。

参考:

静态关键词
智能指针

在下面的代码中,所需的结果是向量中的三个不同的指针。

它们是三个不同的指针,但它们都指向同一个数组。 您的代码中只有一个数组:

void insert_into_heap(int num){
    static std::array<int, 2> test;      // <-----------
    test[0] = num;
    heap_array.push_back(&test);
}

但是,每当我添加指向向量的指针时,它都会覆盖向量的所有条目以包含相同的指针。

这不是真正发生的事情。 向量heap_array不是问题,而是test[0] = num; 在每次调用时写入相同的元素。 当你打印时,你会多次打印同一个数组。

我想您将test声明为static因为否则您存储在heap_array的指针指向不再存在的对象。 但是,不清楚为什么首先要在heap_array中使用指针。 阵列需要存在于某处。 使用函数 local static不是解决方案。 存储对象而不是指针,您的问题就消失了。

我确实需要一个指向对象的指针数组,而不是实际的对象。 对于我正在进行的更大的项目

让我重申:数组需要存在于某个地方。 您基本上有两种选择:要么将实际对象存储在另一个容器中,要么存储指向动态分配对象的智能指针。

暂无
暂无

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

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