Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. Problem overriding operator new [modified]

Problem overriding operator new [modified]

Scheduled Pinned Locked Moved C / C++ / MFC
helpcsharpc++visual-studioquestion
7 Posts 3 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J Offline
    J Offline
    JKallen
    wrote on last edited by
    #1

    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; }

    R P 2 Replies Last reply
    0
    • J JKallen

      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; }

      R Offline
      R Offline
      Rinu_Raj
      wrote on last edited by
      #2

      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

      J 1 Reply Last reply
      0
      • R Rinu_Raj

        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

        J Offline
        J Offline
        JKallen
        wrote on last edited by
        #3

        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.

        R 1 Reply Last reply
        0
        • J JKallen

          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.

          R Offline
          R Offline
          Rinu_Raj
          wrote on last edited by
          #4

          You may check this link , http://www.relisoft.com/book/tech/9new.html This may help you RinuRaj

          1 Reply Last reply
          0
          • J JKallen

            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; }

            P Offline
            P Offline
            prasad_som
            wrote on last edited by
            #5

            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

            J 1 Reply Last reply
            0
            • P prasad_som

              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

              J Offline
              J Offline
              JKallen
              wrote on last edited by
              #6

              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.

              P 1 Reply Last reply
              0
              • J JKallen

                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.

                P Offline
                P Offline
                prasad_som
                wrote on last edited by
                #7

                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

                1 Reply Last reply
                0
                Reply
                • Reply as topic
                Log in to reply
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes


                • Login

                • Don't have an account? Register

                • Login or register to search.
                • First post
                  Last post
                0
                • Categories
                • Recent
                • Tags
                • Popular
                • World
                • Users
                • Groups