簡體   English   中英

如何刪除向量的指針

[英]How to delete pointers of vector

我想正確刪除向量的所有元素。 我需要以您應該在下面看到的方式填充結構向量的向量,每次創建一個調用new方法的結構向量。

這是我的代碼:

struct node
{
    int index;
    double value;
}

struct problem
{
    int l;
    struct node **x;
};

struct problem prob;    // set by read_problem
std::vector<node *> vettProbX;


int main(){
    node tmpValue;
    std::vector <node> *temp;

    for (int i=0; i<10; i++)
    {
        temp = new std::vector<node>;

        for (int i=0; i<10; i++)
        {
            tmpValue.index=i;
            tmpValue.value=i;
            temp->push_back(tmpValue);
        }

        vettProbX.push_back(temp->data());

    }

    prob.x=&vettProbX[0];

    //Destructor
    for(int CC=0; CC<vettProbX.size(); CC++)
    {
        delete  temp[CC];
    }
    return 0;
}

我想刪除分配給NEW的所有新對象,但是我不知道如何正確執行。

您分配給new的唯一對象是std::vector<node> *temp; 您可以使用delete temp;刪除它delete temp; 向量自己的析構函數將處理其內容的破壞。 但是,每次調用new時,都必須這樣做。 在這種情況下,您需要分配內部循環,因此您需要在循環結束時調用delete。

但是因為temp僅在作用域內使用,所以無需動態分配它。 您可以像這樣在堆棧上分配它: std::vector<node> temp; 然后,當它超出范圍時(在這種情況下,在函數末尾)它將被自動銷毀。

在您的代碼中,您分配了temp 10次,但由於沒有將它們的指針存儲在任何地方(因此無法再刪除它們),因此您首先泄漏了9次。 您始終會覆蓋先前溫度的指針。 在代碼末尾,您嘗試刪除最后一個臨時文件的內容(因為內容不是指針,所以不能刪除),而不是向量本身。

要實現您要執行的操作,您需要做的是將所有臨時指針存儲在std::vector<std::vector<node>* >中,最后刪除其中的每個向量。 但是,如果根本不使用任何指針,您將擁有更好的代碼。

另外,您有兩個使用相同循環變量的嵌套循環。 它可能無法按預期工作。

我想正確刪除向量的所有元素

由於分配內存的奇怪方式,不可能釋放所有內容。 您可以動態分配temp指向的向量,然后在循環的下一個迭代中覆蓋指向該向量的指針。 就是這樣,一旦指針記錄消失,就無法釋放它。

我需要填寫結構向量的向量

在這種情況下,您應該首先創建一個vector<vector<node>> 如果沒有向量,則不能填充向量的向量,並且當前代碼中也沒有。

如果不保存指向新創建的向量的指針,則在此處創建:

temp = new std::vector<node>;

則無法刪除它並釋放內存。

更改

std::vector<node *> vettProbX;

vettProbX.push_back(temp->data());

std::vector<std::vector<node> *> vettProbX;

vettProbX.push_back(temp);

那么您可以一個一個地刪除vettProbX存儲的每個項目

for (int i = 0; i < vettProbX.size(); i++)
    delete vettProbX[i];

如果您需要訪問這些內存段而不是執行

vettProbX[i]

您將不得不調用data方法

vettProbX[i]->data()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM