Avatar billede conrad Nybegynder
04. november 2003 - 10:55 Der er 11 kommentarer og
2 løsninger

memory leak / destructor

Jeg oplever at mit program efter nogen tids kørsel bryder ned ,med uforudsigeligt resultat. Dvs det kan køre fint igennem de første 1000 gange for pludselig at bryde ned. Jeg tror selv at det må være noget med memory allokering(leak) at gøre. (jeg snakker c++)

1)jeg gemmer objekter i STL strukturer. Når jeg fjerner dem vha korrekt STL metode, hvad sker der så med objektet? (bliver destructor kaldt?)

2)Hvordan ser en simpel destructor ud for en
class Object { int i;List<double> l; Myobject my}?

3)Skal jeg selv kalde destructoren når jeg ikke har reference til objectet?

4)Jeg kører på Linux red hat 7.2 - er der nogen tools til at finde leaks?
Avatar billede arne_v Ekspert
04. november 2003 - 11:06 #1
Du skal kalde delete for hver gang du kalde new.

Ellers så leaker du memeory.

Der er ikke garbage collection som i Java og C#.
Avatar billede conrad Nybegynder
04. november 2003 - 11:50 #2
jeg benytter stort set ikke Obj* o = new Obj(),  men Obj o; men jeg går ud fra at det ikke spiller nogen rolle, da Obj o også skaber et objekt som fylder.

For lige at være sikker på at jeg har forstået det korrekt: Når jeg er "færdig" med objektet kalder jeg delete. delete kalder objektets destruktor.

mht spørgsmål 1) Kalder list.remove(e), så min destruktor?
Avatar billede arne_v Ekspert
04. november 2003 - 12:01 #3
Nej.

Obj o;

allokerer plads på stack ikke på heap of forsvinder automatisk
når objektet ryger ud af scope.

Og destructoen bliver kaldt.

delete og new er "koblet"
Avatar billede conrad Nybegynder
04. november 2003 - 12:17 #4
Jeg vender tilbage i aften med nogle lidt mere uddybende spørgsmål.....
Avatar billede segmose Nybegynder
04. november 2003 - 13:14 #5
Har du lavet nogle fornuftige copy constructor?
Avatar billede conrad Nybegynder
04. november 2003 - 13:16 #6
mener du = overload? (og svaret er nej)
Avatar billede segmose Nybegynder
04. november 2003 - 13:23 #7
jeg mener noget som:

class A {
public:
  int *a;
};

int main() {
  A a,b;
  a.a = new int;
  b = a; // nu er der en pointer til den nye int 2 steder og når de a og b frigives kan der opstå fejl hvis du ikke har en copy constructor.

  return EXIT_SUCCESS;
}
Avatar billede segmose Nybegynder
04. november 2003 - 13:26 #8
Prøv at lave en privat copy constructor så finder du hurtigt ud af om du skulle bruge sådan en.
Avatar billede conrad Nybegynder
04. november 2003 - 22:08 #9
jeg har prøvet at lave en private copy constructor erklæring i min .h fil hvilket kompiler uden fejl. Hvis jeg tilføjer en erklæring i .cpp filen får jeg følgende:

In file included from dsr/ACKMonitor.cc:154:
/usr/include/g++-3/stl_pair.h: In method `pair<_T1, _T2>::pair (const
_T1 &, const _T2 &) [with _T1 = const int, _T2 = ACKData]':
/usr/include/g++-3/stl_map.h:164:  instantiated from here
dsr/ACKMonitor.cc:25: `ACKData::ACKData (const ACKData &)' is private
/usr/include/g++-3/stl_pair.h:44: within this context
/usr/include/g++-3/stl_construct.h: In method `pair<const int,
ACKData>::pair (const pair<const int, ACKData> &)':
/usr/include/g++-3/stl_construct.h:48:  instantiated from `construct (_T1 *, const _T2 &) [with _T1 = pair<const int, ACKData>, _T2 = pair<const int, ACKData>]'
/usr/include/g++-3/stl_tree.h:556:  instantiated from `_Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc>::_M_insert (_Rb_tree_node_base *, _Rb_tree_node_base *, const _Value &) [with _Key = int, _Value = pair<const int, ACKData>, _KeyOfValue = _Select1st<pair<const int, ACKData> >, _Compare = less<nsaddr_t>, _Alloc = allocator<ACKData>]'
/usr/include/g++-3/stl_tree.h:908:  instantiated from `_Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc>::insert_unique
(_Rb_tree_iterator<_Value, _Value &, _Value *>, const _Val &) [with _Key = int, _Value = pair<const int, ACKData>, _KeyOfValue = _Select1st<pair<const int, ACKData> >, _Compare = less<nsaddr_t>, _Alloc = allocator<ACKData>]'
/usr/include/g++-3/stl_map.h:164:  instantiated from `map<_Key, _Tp, _Compare, _Alloc>::insert (typename _Rb_tree<_Key, pair<const _Key, _Tp>, _Select1st<pair<const _Key, _Tp> >, _Compare, _Alloc>::iterator, const pair<const _Key, _Tp> &) [with _Key = int, _Tp = ACKData, _Compare = less<nsaddr_t>, _Alloc = allocator<ACKData>]'
dsr/ACKMonitor.cc:154:  instantiated from here
dsr/ACKMonitor.cc:25: `ACKData::ACKData (const ACKData &)' is private
/usr/include/g++-3/stl_construct.h:48: within this contextIn file included from dsr/ACKMonitor.cc:154:
/usr/include/g++-3/stl_pair.h: In method `pair<_T1, _T2>::pair (const
_T1 &, const _T2 &) [with _T1 = const int, _T2 = ACKData]':
/usr/include/g++-3/stl_map.h:164:  instantiated from here
dsr/ACKMonitor.cc:25: `ACKData::ACKData (const ACKData &)' is private
/usr/include/g++-3/stl_pair.h:44: within this context
/usr/include/g++-3/stl_construct.h: In method `pair<const int,
ACKData>::pair (const pair<const int, ACKData> &)':
/usr/include/g++-3/stl_construct.h:48:  instantiated from `construct (_T1 *, const _T2 &) [with _T1 = pair<const int, ACKData>, _T2 = pair<const int, ACKData>]'
/usr/include/g++-3/stl_tree.h:556:  instantiated from `_Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc>::_M_insert (_Rb_tree_node_base *, _Rb_tree_node_base *, const _Value &) [with _Key = int, _Value = pair<const int, ACKData>, _KeyOfValue = _Select1st<pair<const int, ACKData> >, _Compare = less<nsaddr_t>, _Alloc = allocator<ACKData>]'
/usr/include/g++-3/stl_tree.h:908:  instantiated from `_Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc>::insert_unique
(_Rb_tree_iterator<_Value, _Value &, _Value *>, const _Val &) [with _Key = int, _Value = pair<const int, ACKData>, _KeyOfValue = _Select1st<pair<const int, ACKData> >, _Compare = less<nsaddr_t>, _Alloc = allocator<ACKData>]'
/usr/include/g++-3/stl_map.h:164:  instantiated from `map<_Key, _Tp, _Compare, _Alloc>::insert (typename _Rb_tree<_Key, pair<const _Key, _Tp>, _Select1st<pair<const _Key, _Tp> >, _Compare, _Alloc>::iterator, const pair<const _Key, _Tp> &) [with _Key = int, _Tp = ACKData, _Compare = less<nsaddr_t>, _Alloc = allocator<ACKData>]'
dsr/ACKMonitor.cc:154:  instantiated from here
dsr/ACKMonitor.cc:25: `ACKData::ACKData (const ACKData &)' is private
/usr/include/g++-3/stl_construct.h:48: within this contextIn file included from dsr/ACKMonitor.cc:154:
/usr/include/g++-3/stl_pair.h: In method `pair<_T1, _T2>::pair (const
_T1 &, const _T2 &) [with _T1 = const int, _T2 = ACKData]':
/usr/include/g++-3/stl_map.h:164:  instantiated from here
dsr/ACKMonitor.cc:25: `ACKData::ACKData (const ACKData &)' is private
/usr/include/g++-3/stl_pair.h:44: within this context
/usr/include/g++-3/stl_construct.h: In method `pair<const int,
ACKData>::pair (const pair<const int, ACKData> &)':
/usr/include/g++-3/stl_construct.h:48:  instantiated from `construct (_T1 *, const _T2 &) [with _T1 = pair<const int, ACKData>, _T2 = pair<const int, ACKData>]'
/usr/include/g++-3/stl_tree.h:556:  instantiated from `_Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc>::_M_insert (_Rb_tree_node_base *, _Rb_tree_node_base *, const _Value &) [with _Key = int, _Value = pair<const int, ACKData>, _KeyOfValue = _Select1st<pair<const int, ACKData> >, _Compare = less<nsaddr_t>, _Alloc = allocator<ACKData>]'
/usr/include/g++-3/stl_tree.h:908:  instantiated from `_Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc>::insert_unique
(_Rb_tree_iterator<_Value, _Value &, _Value *>, const _Val &) [with _Key = int, _Value = pair<const int, ACKData>, _KeyOfValue = _Select1st<pair<const int, ACKData> >, _Compare = less<nsaddr_t>, _Alloc = allocator<ACKData>]'
/usr/include/g++-3/stl_map.h:164:  instantiated from `map<_Key, _Tp, _Compare, _Alloc>::insert (typename _Rb_tree<_Key, pair<const _Key, _Tp>, _Select1st<pair<const _Key, _Tp> >, _Compare, _Alloc>::iterator, const pair<const _Key, _Tp> &) [with _Key = int, _Tp = ACKData, _Compare = less<nsaddr_t>, _Alloc = allocator<ACKData>]'
dsr/ACKMonitor.cc:154:  instantiated from here
dsr/ACKMonitor.cc:25: `ACKData::ACKData (const ACKData &)' is private
/usr/include/g++-3/stl_construct.h:48: within this context

Er det det du mener med jeg kan se jeg mangler den?
Avatar billede segmose Nybegynder
06. november 2003 - 09:44 #10
Det kan jeg ikke overskue, kunne du vise noget af den kode der ligger omkring de ovenstående linier?
Avatar billede conrad Nybegynder
06. november 2003 - 10:09 #11
Hej segmose

Jeg har "løst" problemet, dvs jeg har omskrevet noget af koden og copy pastet noget nogen andre havde skrevet. Jeg fandt dog aldrig ud af hvor problemet var:) Hvis du læser http://www.eksperten.dk/spm/423285 kan du se hvorfor det nok ikke var en memory leak.

Den fejl der kom (ovenstående) opstod når jeg prøvede at lave en copy constructor. Fejlen opstod da jeg oprettede en iterator i metoden og prøvede at kopiere elementer fra en STL list til en anden.

Status: problemet er løst. Du og Arne må gerne lægge nogen svar da jeres hjælp har fået mig til at indse at jeg havde nogle gevaldige forståelses mæssige huller (det har jeg stadig, bare lidt mindre :) ). Og tak for hjælpen iøvrigt!
Avatar billede segmose Nybegynder
06. november 2003 - 11:13 #12
Så gerne.
Avatar billede arne_v Ekspert
06. november 2003 - 20:49 #13
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester