从C++中的指针向量中删除元素

Kra*_*nar 1 c++ stl vector delete-operator

我记得听说下面的代码不符合C++,并希望有比我更多C++法律术语的人能够确认或否认它.

std::vector<int*> intList;
intList.push_back(new int(2));
intList.push_back(new int(10));
intList.push_back(new int(17));

for(std::vector<int*>::iterator i = intList.begin(); i != intList.end(); ++i) {
  delete *i;
}
intList.clear()
Run Code Online (Sandbox Code Playgroud)

理由是,向量包含指向无效内存的指针是非法的.现在显然我的例子将编译,它甚至可以在我所知道的所有编译器上工作,但是它是标准兼容的C++还是我应该执行以下操作,我被告知实际上是符合标准的方法:

while(!intList.empty()) {
  int* element = intList.back();
  intList.pop_back();
  delete element;
}
Run Code Online (Sandbox Code Playgroud)

Kir*_*sky 8

您的代码有效,但更好的解决方案是使用智能指针.

问题是所有要求std::vector都位于C++标准的23.2.4部分.无效指针没有限制.std::vector作品有int*与任何其他类型的(我们不考虑的情况下vector<bool>),它并不关心他们在哪里点.

  • @Kranar - "考虑复制指向无效内存的指针是非法的" - 不,不是.但是,取消引用这样的指针当然是. (4认同)
  • @Kranar,C或C++规范中没有任何内容禁止使用无效指针,只要您不取消引用它们即可.你有一种误解. (2认同)

小智 5

你的代码很好.如果您担心某些元素暂时无效,请将循环体改为

int* tmp = 0;
swap (tmp, *i);
delete tmp;
Run Code Online (Sandbox Code Playgroud)