PDA

View Full Version : [C++] Memory leaks con i <vector>


ercand
03-02-2007, 21:09
Vi scrivo il codice delle varie classei


#include <Windows.h>
#include <vector>
#include <crtdbg.h>


#include "classe_a.h"



using namespace std;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );


PtrA->Init();
int h;
h=0;
return h;
}




//File classe_a.h

class ClasseA
{
public:
ClasseA();
virtual void Init();
};

extern ClasseA* PtrA;

//File classe_a.cpp
#include "classe_a.h"


ClasseA::ClasseA()
{

}

void ClasseA::Init()
{
int fkf=0;
}


File

//File classe_b.h
#include <Windows.h>
#include "classe_a.h"

class Bb: public ClasseA
{
public:
Bb();
void Init();
};

//File classe_b.cpp
#include "classe_b.h"
#include <vector>
using namespace std;
ClasseA* PtrA = new Bb();

Bb::Bb():ClasseA()
{

}
void Bb::Init()
{
vector<int> ss;
ss.push_back(43);
ss.clear();
}



Questo codice genera memory leak quando faccio ss.push_back(43);, perchè? i vector di int come possono generare memory leak :eek: ?

Aiuto :oink: .

vizzz
04-02-2007, 02:33
ho dato una lettura veloce visto l'ora ma credo che tu non deallochi la classe che istanzi.

jappilas
04-02-2007, 11:35
ho dato una lettura veloce visto l'ora ma credo che tu non deallochi la classe che istanzi.sì, c'è un new senza il corrispondente delete ;)
posto che comunque nelle FAQ di stl e stlport si afferma che il distruttore della classe contenitore cerca di minimizzare allocazioni e deallocazioni consecutive...

a parte che quel codice mi sembra inutilmente contorto ... e ah, perchè questa riga di codice
ClasseA* PtrA = new Bb();
è "vagante" ? ;)

ercand
04-02-2007, 16:09
Si avete ragione non ho fatto il delete della classe istanziata, comunque ho riportato male la classe_b

//File classe_b.h
#include "classe_a.h"
#include <Windows.h>
#include <vector>
using namespace std;

class Bb: public ClasseA
{
public:
Bb();
void Init();
vector <int> ss;
};

//File classe_b.cpp
#include "classe_b.h"

ClasseA* PtrA = new Bb();

Bb::Bb():ClasseA()
{
}
void Bb::Init()
{
ss.push_back(43);
}


esenguo questo codice mi da il messaggio

Detected memory leaks!
Dumping objects ->
{241} normal block at 0x00366A98, 4 bytes long.
Data: <+ > 2B 00 00 00
Object dump complete.
The program '[1740] gtgtgtgt.exe: Native' has exited with code 0 (0x0).

che appare solo quando faccio il push_back() :muro: