簡體   English   中英

如何從向量指針中刪除指針

[英]How to delete pointers from vector pointer

我將使用具有union類型的bison解析器生成器用於返回類型的生產。

union {
    std::vector<std::string*> *vecStrPtr;
    // double num; ...
};

如何從向量指針中刪除指針;

    auto v = new std::vector<std::string*>();
 //....
    v->push_back(new std::string("text"));
//...
    delete v[0]; 

錯誤:將類型'class std::vector<std::__cxx11::basic_string<char>*>'參數賦予'delete',預期指針delete v[0];

當您只執行v[0]您將獲得向量,因為v是一個指針,然后您需要從該向量中獲取值。 您可以通過添加另一個數組訪問來做到這一點。 因此工作代碼看起來像delete v[0][0]; 但是,當您從一維數組(向量)訪問值時,兩次數組訪問可能會造成混淆。

從指針v獲取向量的另一種方法是取消引用。 代碼看起來像(*v)[0] 訪問值更清晰。 使用(*v)您將獲得向量,然后數組訪問將訪問向量中的值。

要從向量中刪除值,請使用erase方法。 有關該方法的更多信息,請參見此鏈接 代碼示例如下所示:

auto v = new std::vector<std::string*>();
//....
v->push_back(new std::string("text"));
//...
delete (*v)[0];
v->erase(v->begin());

更好的是編寫沒有關鍵字new的代碼。 使用該規則,您將獲得更少的內存泄漏。 它使您的開發更加輕松。 但是在某些情況下,您將無法使用它。 通過該規則修改的代碼示例如下所示:

std::vector<std::string> v;
v.push_back(std::string("text"));

//here is how to get pointers from it
std::string* ptrToElement = &(v[0]);
std::vector<std::string>* ptrToVector = &v;

釋放一件物品的正確方法是:

delete (*v)[index];
v->erase(b->begin()+index);

但是,您應該確保確實要在免費存儲區中分配向量。 看來通常是錯的。

PS如@Dahn所述,這兩個指令應該是原子的。

暫無
暫無

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

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