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