for_each为何不能直接用delete?该如何解决
for_each为何不能直接用delete?
in think in c++ 2 volume.
下面的a是一个容器,里面转的是指针。
template <class T>
void wipe(T* x) { delete x; }
for_each(a.begin(), a.end(), wipe <Counted> );
是合法的,但
for_each(a.begin(), a.end(), ptr_fun(operator delete));
却有bug。
据书上说是delete接受void*,但iterator不是指针,所以不会调用析构函数。
但是for_each 在调用函数时已经将iterator解引用了,怎么会和iterator有关呢
书上也没说的十分清楚,希望那位高手指点一下
------解决方案--------------------
delete x; 不等于 operator delete (x);
------解决方案--------------------
正如 Wolf0403(废人:地球这么大,何处是我家) 所说:
delete operator // a)
operator delete // b)
是不同的.
1.
int * pi = new int();
delete pi;
这里的 delete 是说的上诉 a). 它是 C++ 语言规定的.
2. a) 实行两部分工作. 第一, 调用要清理对象的析构器. 第二, 调用 b) 进行内存的回收.
3. b) 基本上可以类比 C 库中的 free 函数. 事实上, 它是标准库中定义的方法(我说 operator delete 是方法会挨骂吗?). 它的原型大致如下:
void operator(void *);
4. 因此, 你使用 operator delete, 首先一定不会调用 destructor 了.
5. 关于 iterator, 在 for_each 中的确 dereference 了. 那么请看(显意啊, 不正规).
vector <int> ::iterator it = a.begin();
operator delete(*it);
你觉得合适吗? *it 不能转换成 void * 吧.
所以, 真的要这么干, 也要想办法如此:
operator delete(&*it);
显然, 这么一搞, 你的 function object 要重新设计了.
------解决方案--------------------
destory是STL里的辅助函数,可见于《STL源码剖析》P51
in think in c++ 2 volume.
下面的a是一个容器,里面转的是指针。
template <class T>
void wipe(T* x) { delete x; }
for_each(a.begin(), a.end(), wipe <Counted> );
是合法的,但
for_each(a.begin(), a.end(), ptr_fun(operator delete));
却有bug。
据书上说是delete接受void*,但iterator不是指针,所以不会调用析构函数。
但是for_each 在调用函数时已经将iterator解引用了,怎么会和iterator有关呢
书上也没说的十分清楚,希望那位高手指点一下
------解决方案--------------------
delete x; 不等于 operator delete (x);
------解决方案--------------------
正如 Wolf0403(废人:地球这么大,何处是我家) 所说:
delete operator // a)
operator delete // b)
是不同的.
1.
int * pi = new int();
delete pi;
这里的 delete 是说的上诉 a). 它是 C++ 语言规定的.
2. a) 实行两部分工作. 第一, 调用要清理对象的析构器. 第二, 调用 b) 进行内存的回收.
3. b) 基本上可以类比 C 库中的 free 函数. 事实上, 它是标准库中定义的方法(我说 operator delete 是方法会挨骂吗?). 它的原型大致如下:
void operator(void *);
4. 因此, 你使用 operator delete, 首先一定不会调用 destructor 了.
5. 关于 iterator, 在 for_each 中的确 dereference 了. 那么请看(显意啊, 不正规).
vector <int> ::iterator it = a.begin();
operator delete(*it);
你觉得合适吗? *it 不能转换成 void * 吧.
所以, 真的要这么干, 也要想办法如此:
operator delete(&*it);
显然, 这么一搞, 你的 function object 要重新设计了.
------解决方案--------------------
destory是STL里的辅助函数,可见于《STL源码剖析》P51