On Apr 20, 3:04 pm, "Victor Bazarov" <v.Abaza...@comAcast.netwrote:
Quote:
Anu wrote: Quote:
We have a class that has its own overloaded operator new and whose
prototype seems to correspond to the standard placement new :-
| |
Quote:
Quote:
class AppClass
{
public:
operator new (size_t size, void *ctx)
.....
}
| |
Quote:
Quote:
The ctx is important for us. Now we find that if we have a
vector<AppClassinstance, when the vector is resized, our overloaded
operator new is called!. Here is the comment from the STL vector
implementation :-
| |
Quote:
Quote:
template<class _T1,
class _T2inline
void _Construct(_T1 _FARQ *_Ptr, const _T2& _Val)
{ // construct object at _Ptr with value _Val
new ((void _FARQ *)_Ptr) _T1(_Val);
}
| |
Quote:
Quote: |
Is this documented somewhere in the standard?
| |
Quote:
|
No, it's an implementation detail.
|
Not really. The standard does require that the implementation
of vector separate allocation and construction, and the only way
to call a constructor is by using placement new.
I would consider this a bug in the library; the statement in
question should be:
::new ((void _FARQ *)_Ptr) _T1(_Val);
, since this is the only way to guarantee that you get the
standard placement new. I think a bug report is justified. (On
the other hand, I'm not really too surprised about the bug.
It's the sort of thing that's easy to overlook.)
--
James Kanze (Gabi Software) email:
james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34