C++的vector的erase函数实现如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| iterator erase(iterator position){ if (position + 1 != end()) {
copy(position + 1, finish, position); }
--finish;
destroy(finish);
return position; }
|
就是将position+1 到 finish 之间的元素一个一个复制到从 position 指向的空间,这样,就把 position 原来指向的元素个覆盖了。同时注意到destroy(finish);
释放最后一个元素,因此position位置的元素不会被释放,最后一个元素会被释放造成UAF。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| //假设有如下的一个列表,其内存空间表示如下: //--------------------------------------------------------- //| 1 | 2 | 3 | 4 | 5 | | | //--------------------------------------------------------- // | // finish //现在,要删除第二个元素 2 这个对象。 //所以,执行 copy 之后,把 3, 4, 5 对象往前移动,其内存空间如下: //--------------------------------------------------------- //| 1 | 3 | 4 | 5 | 5 | | | //--------------------------------------------------------- // | // finish //注意,第 5 个元素的内存空间还是原来的对象 5 这个对象。 //然后,执行 --finish; 操作,移动指针,如下: //--------------------------------------------------------- //| 1 | 3 | 4 | 5 | 5 | | | //--------------------------------------------------------- // | // finish //然后,执行 destroy(finish); 操作,执行的是第 5 个元素的析构函数,而 //我们删除的第2个对象,并没有执行其析构函数,只是把它在内存空间给覆盖了。
|