繁体   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