如何从向量指针中删除指针

时间:2016-11-17 10:26:01

标签: c++ pointers vector

我使用具有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>*>'参数&#39;删除&#39;,预期指针delete v[0];

2 个答案:

答案 0 :(得分:1)

当你只做v[0]时,你得到了向量,因为v是一个指针然后你需要从那个向量中获取值。您可以通过添加另一个阵列访问来实现。所以工作代码看起来像delete v[0][0];。但是,当您从一个维度数组(向量)访问值时,两个数组访问可能会造成混淆。

从指针v获取向量的另一种方法是取消引用它。代码看起来像(*v)[0]。访问价值更加清晰。使用(*v),您将获得向量,然后数组访问将从向量访问值。

从矢量使用方法erase中删除值。有关该方法的更多信息,请查看此link。代码示例如下:

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;

答案 1 :(得分:0)

免费获得一件物品的正确方法是:

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

但是,您应该确保您真的想在免费商店中分配一个向量。看起来通常是错的。

P.S。正如@Dahn所说,这两条指令应该是原子的。