簡體   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