[英]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.