Re: Memory deallocation does not work.
christophe.chazeau@gmail.com wrote:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <vector>
#include <iterator>
using namespace std;
class Test{
public :
unsigned char *data ;
Test(){
}
void Go(int taille)
{
data = (unsigned char*) malloc(taille);
printf("malloc : %p\n",data);
}
~Test()
{
printf("delete %p\n",data);
free(data);
}
};
vector<Test *> v;
It is dangerous - possible memory leak because vector<Test *> does not own
the object pointer point to. Use any RAII memory wrapper (see RAII here:
http://www.hackcraft.net/raii ) instead of Test *
vector<auto_ptr<Test> > v;
or give each address (stored in vector<Test *>) to other object, which will
keep object.
{
auto_ptr<Test> owner(new Test);
vector<Test *> v;
v.push_back(*owner);
}
int i = 0 ;
int main()
{
sleep(10);
for(i = 0;i<10000;i++)
{
Test *t = new Test();
t->Go(75000);
v.push_back(t);
}
sleep(10);
vector<Test *>::iterator it;
for(it=v.begin() ; it!=v.end();it++)
Do you need "it" outside of "for"?
Try to inplement postfix operator ++, and you will see, that pferix ++ is
better.
Avoid repeating function call "v.end()" if you are sure, that the function
will always return the same.
vector<Test *>::iterator end(v.end());
for(vector<Test *>::iterator it(v.begin()); it!=end; ++it)
{
Test *t = *it;
delete(t);
}
sleep(10);
}
To return memory to OS, instead of std malloc/free you need to implement
native for you OS memory manager
namespace Nxxx_OS
{
void* malloc(); //will call OS specific allocate
void free(void*const); //will call OS specific free
//namespace Nxxx_OS
}
Note, you need to stay coherrent with all other memory management, so
probably you need to change all system memory allocation for the target.
--
Maksim A. Polyanin
"In thi world of fairy tales rolls are liked olso"
/Gnume/