C++: Memory Problems Memory Leak Memory Leak Memory Leak

C++: Memory Problems Memory Leak Memory Leak Memory Leak

Memory Leak • A bug in a program that prevents it from C++: Memory Problems freeing up memory that it no longer needs. • As a result, the program grabs more and more memory until it finally crashes or because there is no more memory left. When Good Memory Goes Bad • In short: – Allocating without cleaning up. Memory Leak Memory Leak class Foo Foo::Foo (int size) : { asize (size), array_member (new int[size]) { private: for (int i=0; i<size; i++) int *array_member; array_member[i] = 0; int asize; } ... public: void f () { Foo (int size); // local aClass object ~Foo (); aClass a (20); } ... } Memory Leak Pointer Ownership • Everything that is a pointer should be owned aClass a asize – Responsible for cleanup when finished array_member 20 – Should be known to programmer ints – Should be by design during implementation. stack – Owner and only owner should perform a delete. heap 1 Pointer Ownership Pointer Ownership • Class members // constructor Foo::Foo (int size) : – If you allocate it during construction, you asize (size), array_member (new int[size]) should deallocate during destruction. { for (int i=0; i<size; i++) array_member[i] = 0; } – Should also deallocate during // destructor • Copy construction Foo:~Foo () • operator= { delete [] array_member; } Pointer Ownership Pointer Ownership // copy constructor // assignment operator Foo::Foo (const Foo &F) Foo &Foo::operator= (const Foo &F) { { if (F != (*this) { if (F != (*this) { delete [] array_member; delete [] array_member; array_member = new int[F.asize]; array_member = new int[F.asize]; asize = F.asize; asize = F.asize; for (int i=0; i<asize; i++) array_member[i] = F.array_member[i]; for (int i=0; i<asize; i++) } array_member[i] = F.array_member[i]; } return (*this); } } Pointer Ownership Pointer Ownership • Pointers returned by functions class Moo { – Who should be responsible for memory to private: which these pointers point? char* myID static char anotherId[15]; ... public: Moo (); ... char *getID(); } 2 Pointer Ownership Pointer Ownership Allocation done in method…caller should be Allocation done in constructor…object should be responsible responsible for pointer. for pointer….should deallocate in destructor Moo::Moo () : myID (new char[15]) char * Moo::getID() { { strcpy (id, “I am a cow”); char *id = new char[15]; } strcpy (id, “I am a cow”); char * Moo::getID() { return id; return myID; } } Pointer Ownership Pointer Ownership Memory is static…object should be responsible for Memory is static…object should be responsible for pointer but no deallocation necessary pointer but no deallocation necessary char Moo::anotherID[15] = “I am a cow”; char * Moo::getID() { // This is okay too. char * Moo::getID() static char idInFunct[50] = “I am a { cow”; return anotherID; return idInFunct; } } Pointer Ownership Pointer Ownership Should not return pointer to local variable • Pointers returned by functions – Who should be responsible for memory to char * Moo::getID() which these pointers point? { • Either caller or object // This is not okay. • Should be clearly designed and documented char idInFunct[50] = “I am a cow”; return idInFunct; } 3 Pointer Ownership Pointer Ownership • Anonymous Objects • Anonymous Objects – Beware when anonymous objects are allocated on free – An anonymous object is an object in every store. sense except that it has no name. vector< Card * > hand; – Used for creating very temporary objects. hand.push_back( new Card(...) ); hand.push_back( new Card(...) ); hand.push_back( new Card(...) ); Point square[] = : {Point(0,0),Point(0,1),Point(1,1),Point(1,0) : }; If vector does not take ownership of the objects stored in it, a memory leak is possible. Memory Leak / Pointer Dangling Pointers Ownership • Questions? • Pointer is pointing to something that it shouldn’t be. • Can happen if: – If the scope of a pointer extends beyond that of the object being pointed to • i.e Returning a pointer to a local variable. – If a dynamically allocated memory cell is freed explicitly and then the pointer pointing to such a space is used in subsequent code. Dangling Pointers Dangling Pointers p1 = new Foo; • Ways to prevent dangling pointers : – Do not return pointers to local variables. delete p1; – After calling on a pointer, : delete immediately set it to NULL. p2 = new Bar; // What if same memory is //given to p2? p1 = new Foo; : delete p1; int i = p1->data; // i contains garbage p1 = 0; p2 = new Bar; p1->op(...); // p2's object mysteriously p1->op(...); // core dump! changes! 4 Overwriting Arrays Overwriting Arrays • Recall that C++ has no array bounds void foo() { checking. int *a = new int[20]; – Writing past bounds of array will trash aClass *b = new aClass(); ... a unsuspecting memory. a[20] = 23; // b mysteriously // changes } b heap Overwriting Arrays Overwriting Arrays void foo() • This can be quite dangerous for local arrays: Local Variables { int a[20]; a[20] = 23; a Local Variables } Return Address Return Address Function Arguments Function Arguments Dangling Pointers / Overwriting Overwriting Arrays Arrays void foo() • Questions? { char a[20]; strcpy (a, “This string is too long”); } 5 Getting around these problems The Smart Pointer • The smart pointer Smart pointer – Prevents memory leaks and dangling pointers – Wrapper class that owns a pointer to an object ptr • Object keeps a reference count of variables accessing it • When the reference count reaches 0, the object is deleted by the smart pointer. • After deleting object, pointer value set to 0. The Smart Pointer Using smart pointers • The smart pointer should look and act Instead of Use like a regular pointer: – Should support -> void foo() void foo() – Should support * { { MyClass* p(new MyClass); SmartPtr<MyClass> • Should be smarter than your average pointer. p->DoSomething(); p(new MyClass); delete p; p->DoSomething(); – Reduce memory leaks } } – Reduce dangling pointers – Take ownership p will cleanup after itself Smart Pointers • We will be looking at the details of a smart pointer in Week 10 • There is a Smart Pointer class available for use on the project – See choices.html of of Project pages • Questions? 6.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    6 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us