Problem overriding operator new [modified]
-
I am over-riding operator new []. I am getting the following error.... c:\Visual Studio Projects\JLib\main.cpp(149): error C2661: 'Object::operator new[]' : no overloaded function takes 3 arguments The following code results in the above comilation error. Object* objects; objects = new Object[5]; // <- error occurrs here delete [] objects; If anyone knows what is going on I would very much appreciate an explanation. Here is the relevant declarations and definitions... #pragma once #include using namespace std; template class Object{ public: //CONSTRUCTORS ETC ETC ETC void* operator new[](size_t size) throw(bad_alloc); void* operator new[](size_t size,const nothrow_t&) throw(); void operator delete[](void* ptr) throw(); void operator delete[](void* ptr,const nothrow_t&) throw(); //OTHER STUF }; template void* Object::operator new[](size_t size) throw(bad_alloc){ Object* data = 0; if ( (data = ::operator new[](size){ //ommitted for brevity } return data; } template void* Object::operator new[](size_t size,const nothrow_t&) throw(){ Object* data = 0; if ( (data = ::operator new[](size,const nothrow_t&)) ){ //ommitted for brevity } return data; } template void Object::operator delete[](void* ptr) throw(){ ::operator delete [] (ptr); ptr = 0; } template void Object::operator delete[](void* ptr,const nothrow_t&) throw(){ ::operator delete [] (ptr,const nothrow_t&); ptr = 0; }
-
I am over-riding operator new []. I am getting the following error.... c:\Visual Studio Projects\JLib\main.cpp(149): error C2661: 'Object::operator new[]' : no overloaded function takes 3 arguments The following code results in the above comilation error. Object* objects; objects = new Object[5]; // <- error occurrs here delete [] objects; If anyone knows what is going on I would very much appreciate an explanation. Here is the relevant declarations and definitions... #pragma once #include using namespace std; template class Object{ public: //CONSTRUCTORS ETC ETC ETC void* operator new[](size_t size) throw(bad_alloc); void* operator new[](size_t size,const nothrow_t&) throw(); void operator delete[](void* ptr) throw(); void operator delete[](void* ptr,const nothrow_t&) throw(); //OTHER STUF }; template void* Object::operator new[](size_t size) throw(bad_alloc){ Object* data = 0; if ( (data = ::operator new[](size){ //ommitted for brevity } return data; } template void* Object::operator new[](size_t size,const nothrow_t&) throw(){ Object* data = 0; if ( (data = ::operator new[](size,const nothrow_t&)) ){ //ommitted for brevity } return data; } template void Object::operator delete[](void* ptr) throw(){ ::operator delete [] (ptr); ptr = 0; } template void Object::operator delete[](void* ptr,const nothrow_t&) throw(){ ::operator delete [] (ptr,const nothrow_t&); ptr = 0; }
-
You may use void* operator new(size_t size) throw(bad_alloc); instead void* operator new[](size_t size) throw(bad_alloc); wer ever it is used so .... RinuRaj
-
I need to define an implementatino of the [] version because the instances of Object have data regarding adjacent instantiations when created via new [] . At least logically they do, so it makes sense to set those relationships in the new construction.
You may check this link , http://www.relisoft.com/book/tech/9new.html This may help you RinuRaj
-
I am over-riding operator new []. I am getting the following error.... c:\Visual Studio Projects\JLib\main.cpp(149): error C2661: 'Object::operator new[]' : no overloaded function takes 3 arguments The following code results in the above comilation error. Object* objects; objects = new Object[5]; // <- error occurrs here delete [] objects; If anyone knows what is going on I would very much appreciate an explanation. Here is the relevant declarations and definitions... #pragma once #include using namespace std; template class Object{ public: //CONSTRUCTORS ETC ETC ETC void* operator new[](size_t size) throw(bad_alloc); void* operator new[](size_t size,const nothrow_t&) throw(); void operator delete[](void* ptr) throw(); void operator delete[](void* ptr,const nothrow_t&) throw(); //OTHER STUF }; template void* Object::operator new[](size_t size) throw(bad_alloc){ Object* data = 0; if ( (data = ::operator new[](size){ //ommitted for brevity } return data; } template void* Object::operator new[](size_t size,const nothrow_t&) throw(){ Object* data = 0; if ( (data = ::operator new[](size,const nothrow_t&)) ){ //ommitted for brevity } return data; } template void Object::operator delete[](void* ptr) throw(){ ::operator delete [] (ptr); ptr = 0; } template void Object::operator delete[](void* ptr,const nothrow_t&) throw(){ ::operator delete [] (ptr,const nothrow_t&); ptr = 0; }
Can you help reproducing this error ? I tried this way.
template <typename T> class A
{
public:
void* operator new[](size_t t) throw();
};
template <typename T>void* A<T>::operator new[](size_t t) throw()
{
return NULL;//just doing nothing
}int main(int argc, char* argv[])
{A\* objects; objects = new A<double> \[5\]; delete \[\] objects; return 0;
}
But no error occurs. -- modified at 1:38 Tuesday 12th September, 2006
Prasad Notifier using ATL
-
Can you help reproducing this error ? I tried this way.
template <typename T> class A
{
public:
void* operator new[](size_t t) throw();
};
template <typename T>void* A<T>::operator new[](size_t t) throw()
{
return NULL;//just doing nothing
}int main(int argc, char* argv[])
{A\* objects; objects = new A<double> \[5\]; delete \[\] objects; return 0;
}
But no error occurs. -- modified at 1:38 Tuesday 12th September, 2006
Prasad Notifier using ATL
The only difference between your use of the new operator and mine (using your class) is... Your version: A* objects; objects = new A [5]; delete [] objects; return 0; My version: A* objects; objects = new A [5]; delete [] objects; return 0; I dont understand how your code can work without the template type being defined.
-
The only difference between your use of the new operator and mine (using your class) is... Your version: A* objects; objects = new A [5]; delete [] objects; return 0; My version: A* objects; objects = new A [5]; delete [] objects; return 0; I dont understand how your code can work without the template type being defined.
JKallen wrote:
Your version: A* objects; objects = new A [5]; delete [] objects; return 0;
Actually, I added < and > there,but suppressed due to html formatting(In all other places I used "andlt and andgt" . I modified it now. And its working fine. Am I missing something?
Prasad Notifier using ATL