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