我在与矢量相关的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]的代码可能仍然存在?
答案 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标志。