簡體   English   中英

在C ++中添加元素並清除指針向量

[英]Add elements and clear a vector of pointers in C++

我想向vector<Node*>添加2個元素,然后清除所有元素並釋放內存。
這段代碼是否以正確的方式執行此操作?

#include <stdlib.h>
#include <iostream>
#include <vector>

using namespace std;

class Node {
public:
    int value;
    // ...and some other fields and methods...
};

int main(int argc, char** argv) {
    Node* n = new Node;
    n->value = 20;
    vector<Node*> v;
    v.push_back(n);
    n = new Node;
    n->value = 52;
    v.push_back(n);
    for (vector<Node*>::iterator i = v.begin(); i != v.end(); i++) {
        cout << (*i)->value << endl;
        delete *i;
        *i = NULL;
    }
    v.clear();
    return (EXIT_SUCCESS);
}

它看起來很好。 我會改變一些事情(主觀上):

*i = NULL;  // This is unnecessary.

然后我會避免重復使用n (實際上,我完全避免使用它):

v.push_back(new Node);
v.back()->value = 20;
v.push_back(new Node);
v.back()->value = 52;

此外,您可能需要考慮智能指針來跟蹤您的記憶。 請參閱shared_ptrptr_vector

這將做你期望的。 但是, clear()是完全沒必要的,因為當你離開當前作用域之后, vector將被銷毀(在這種情況下也恰好是函數的結尾和程序的結尾)。 如果你打算保持vector來做更多的事情,那么clear()將從vector刪除所有指針。 事實上, vector正在被摧毀,因此調用clear()沒有意義。

另外,我的討厭者想說你應該在你的循環而不是i++使用++i ,因為i++創建了一個臨時的,編譯器無法優化掉(因為你正在處理一個重載的運算符)。 此外,由於您只是在刪除其中的所有內容后立即銷毀該vector ,因此將其所有元素設置為NULL並沒有多大意義。 如果你要重新使用元素而不是清除或破壞vector ,那么這將是一個好主意。 但在這種情況下,它只是效率低下。

是的有效。

一些評論:

  • 而不是包括stdlib.h,c ++等價物是cstdlib。
  • 如果你真的不需要指針,你的向量可以是vector<Node> ; 如果你需要它們,最好使用智能指針。

暫無
暫無

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

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