向量是否仍然存在?

时间:2012-03-14 23:09:55

标签: c++ vector

我在与矢量相关的c ++游戏中遇到了问题。 我想知道是否有任何代码告诉我矢量是否仍然存在。 示例(x =我创建的结构):

vector<x*> var;
var.push_back(new x);
var[5]->Pos_X = 10;

现在我想要的是:

delete var[5];

if(var[5] still exists){
     var[5]->Pos_X = 20;
}

var [5]的代码可能仍然存在

4 个答案:

答案 0 :(得分:4)

除非您在删除指针后实际将指针设置为null,否则无法确定向量中的该插槽是否包含指向活动对象的指针。

所以你需要: delete vec[5]; vec[5] = NULL;

然后你可以测试

if (vec[5] == NULL)

确定该地点是否有“真正”的东西。

答案 1 :(得分:3)

没有代码,在删除过程中没有额外的细心工作。如果您存储智能指针,您可以这样做:

vector<unique_ptr<x>> var;
// assuming you actually do add 6 or more elements to the vector
...
var[5].reset();

if (var[5]) { ... }

答案 2 :(得分:1)

您可以使用var.size()查看向量是否包含var[5]处的指针,但这不会告诉您指针是否有效。

您可以创建一个小包装类:

template <class T>
class wrapper {
    bool valid;
    T *data_;
public:
    wrapper(T *d): data_(d), valid(true) {}
    del() { delete data; valid = false; }
    bool isValid() { return valid; }
    T *data() { return valid ? data : NULL; }
};

std::vector<wrapper<x> > var;

var[5].del();

if (var[5].valid())
   var[5].data()->Pos_X = 20;

就个人而言,我更愿意确保所有指针始终有效。

答案 3 :(得分:0)

调用delete你正在释放那个x *所指向的内存,所以你仍然有一个指向某个内存地址的指针,这些地址不再包含你所想要的内容。

如果要从矢量中删除元素,请考虑使用“erase”;然后,如果你不想擦除但只是“取消”第N个元素,那么结构就是你的......在你的结构中添加一些bool标志。