In C++ How to decide or know if a pointer was deleted before??
when i tried to delete a pointer that was previously deleted in another part of the code it threw an exception that can't be handled.
I was wondering if there is a way to check or try delete the pointer ? any reference about advanced memory operations.
also i want to master the un-handled exceptions of pointers and the access to protected or access is violation ,... this kind of error.
thanks for those who give some of their knowledge and their time to help other people and share their benfits
The big advice from a lot of modern c++ developers community is - Use smart pointers or try to avoid the use of raw pointers. But for throw security and insuring free of memory (ISO_CPP_FAQ) and of course if you want to avoid the small overhead of using smart pointers[may not be noticeable always but they have overhead] you can write your custom methods that deal with raw pointers [type*] - this is not general. Prefer always smart pointers to raw pointers.
In 'Going Native 2013' a common advice given was - Never use raw pointers.
The address of the pointer does not change after you perform delete on it. The space allocated to the pointer variable itself remains in place until your program releases it (which it might never do, e.g. when the pointer is in the static storage area).
delete keyword in C++ New operator is used for dynamic memory allocation which puts variables on heap memory. Which means Delete operator deallocates memory from heap. Pointer to object is not destroyed, value or memory block pointed by pointer is destroyed.
Dangling pointers arise when an object is deleted or de-allocated, without modifying the value of the pointer, so that the pointer still points to the memory location of the de-allocated memory. In short pointer pointing to non-existing memory location is called dangling pointer.
Deleting the pointer won't set it to NULL, it deletes the memory pointed to by the pointer. Even if you were to examine the memory you won't be able to make out whether it's free or not.
There can be three solutions. You might want to choose one depending on the effort/quality ratio you want to acheive:
Elegant and most correct solution:
Use smart pointers and you do not have to manually call delete
ever again. This is the best possible way to overcome this problem. It utilizes the principle of RAII which works perfectly for a language like C++ which does not have an in-built garbage collector.
Less elegant but workable solution:
Assign the pointer to NULL
after deletion. Calling delete
on a NULL
pointer is a no-op so it removes the need to have that extra NULL
check but this might hide some problems instead of making them visible.
Less elegant but more correct solution:
Hunt down all the multiple delete
problems by letting your program crash. You might as well use memory analyzer programs like valgrind and then fix your code to avoid all these problems.
This is a good question, but one of the fundamental truths of working in a manually memory managed environment (like C/C++ and its cousins) is that there's no good way of looking at a pointer after the fact and asking whether it's valid-- once it's become invalid, it's gone, and looking at it is prone to blowing up. Your job is to make sure that it's never deleted or freed more than once, and never accessed after that time.
Definitely look at the smart pointers, which were invented to make programmer's lives easier in just these circumstances. (The more traditional method is to be careful, not screw it up, and then maybe assign NULL to the pointer when you know it's been deleted, as Alok says.)
In C++ How to decide or know if a pointer was deleted before??
The language standard does not offer any legal way to determine whether an arbitrary pointer is valid or not.
There's one way, but it's highly compiler/OS-specific. You can either hook into the existing memory manager or replace it with your own and provide a dedicated function for pointer validation. It may be not very easy to do, though. And you don't really want to rely on this functionality if performance is critical.
use shared_ptr<>
and shared_array<>
, remember shared_ptr<>
can be used to manage memory allocated to an array only if appropriate Deleter is provided, otherwise use shared_array<>
to manage your arrays
A* a_tab=new A[100];
boost::shared_ptr<A> a_tab_ok(a_tab,ArrayDeleter<A>());
//only ok if
template <typename T>
class ArrayDeleter
{
public:
void operator () (T* d) const
{
delete [] d; //will delete array!
}
};
is provided
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With