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)
您的代码有效,但更好的解决方案是使用智能指针.
问题是所有要求std::vector都位于C++标准的23.2.4部分.无效指针没有限制.std::vector作品有int*与任何其他类型的(我们不考虑的情况下vector<bool>),它并不关心他们在哪里点.
小智 5
你的代码很好.如果您担心某些元素暂时无效,请将循环体改为
int* tmp = 0;
swap (tmp, *i);
delete tmp;
Run Code Online (Sandbox Code Playgroud)