Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  c++ array mälu heapis märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
Hazar
Kreisi kasutaja
Hazar

liitunud: 24.08.2004




sõnum 01.04.2012 22:29:04 c++ array mälu heapis vasta tsitaadiga

kujutagem ette, et mul on selline junn:

class wat {
public:
   int data;
   wat::wat() {}
   wat::wat(int a) {
      data = a;
   }
};
main method {
   wat* arrayofwat = new wat[5];
   attayofwat[0] = wat(10); //huvitav rida
}


hiljuti sain teada, et huvitaval real toimub selline tsirkus: tehakse uus wat, uue wati data kopeeritakse vana wati(mis array deklaratsiooniga ehitati) sisse, uus wat kustutatakse ära. Ressursi raiskamisest hoolimata töötab esmapilgul küll aga jama selles, et kui watil peaks olema näiteks pointer datale mis deconstructoris hävitatakse siis selle sama huvitava rea käigus pannakse deconstructor tööle ja data on läinud. Nii palju kui aru olen saanud siis delete[] töötab ainult arrayde peal mis on tehtud new[]'ga, aga kas selline asi töötaks?


main method {
      wat* arrayofwat = malloc(sizeof(wat) * 5);
      arrayofwat[0] = wat(10);
      delete[] wat;
}


või hoopis selline?


main method {
      wat* arrayofwat = malloc(sizeof(wat) * 5);
      arrayofwat[0] = wat(10);
      free(wat);
}


ja seda tahaks ka teada, et kui teen array new keywordiga pointerisse ning siis memcpy'n selle array kuhugi ning saan teise pointeri, kas siis selle teise array peal võib delete[] kasutada?
Kommentaarid: 29 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 28
tagasi üles
vaata kasutaja infot saada privaatsõnum
Supiplex
HV veteran
Supiplex

liitunud: 11.12.2002




sõnum 02.04.2012 11:42:48 Re: c++ array mälu heapis vasta tsitaadiga

Hazar kirjutas:

class wat {
public:
   int data;
   wat::wat() {}
   wat::wat(int a) {
      data = a;
   }
};
main method {
   wat* arrayofwat = new wat[5];
   attayofwat[0] = wat(10); //huvitav rida
}


hiljuti sain teada, et huvitaval real toimub selline tsirkus: tehakse uus wat, uue wati data kopeeritakse vana wati(mis array deklaratsiooniga ehitati) sisse, uus wat kustutatakse ära.


Ei tasu üllatuda. Sa kopeerid objekte. Nii see käibki.

tsitaat:
Ressursi raiskamisest hoolimata töötab esmapilgul küll aga jama selles, et kui watil peaks olema näiteks pointer datale mis deconstructoris hävitatakse siis selle sama huvitava rea käigus pannakse deconstructor tööle ja data on läinud.


Jah loomulikult. Kui su klass täidab tingimusi

1. klassi liikmeks on pointer või reference andmetele mida klass omab (st vastutab nende andmete mäluhalduse eest)
2. klassi instantsi on vaja kopeerida, assignida, funktsiooni argumendiks anda _või_ klassi instantsi on vaja hoida konteineris millega sa tahad kõike eelpool mainitut teha

siis pead klassile lisama copy constructor-i mis kopeerib ka andmed. Google märksõna "c++ deep copy" Sedasorti manipulatsioonid on üldiselt C++ programmeerija leivanumber.

Kui sa soovid et andmeid ei kopeeritaks koos objektiga, siis tuleb smart pointer kasutusele võtta. Kui kasutad gnu tööriistu, siis vaata std::tr1::shared_ptr poole

tsitaat:
Nii palju kui aru olen saanud siis delete[] töötab ainult arrayde peal mis on tehtud new[]'ga, aga kas selline asi töötaks?
main method {
      wat* arrayofwat = malloc(sizeof(wat) * 5);
      arrayofwat[0] = wat(10);
      delete[] wat;
}


Ei, malloc()/free() ja new/delete ei tohi omavahel segada.
http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.3

tsitaat:
või hoopis selline?

main method {
      wat* arrayofwat = malloc(sizeof(wat) * 5);
      arrayofwat[0] = wat(10);
      free(wat);
}


http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.4
Ei soovita. Objekt eeldab et tema tekitamisel ja kopeerimisel kutsutakse välja konstruktor. Kui seda ei juhtu, pole sa enam Kansases.

tsitaat:
ja seda tahaks ka teada, et kui teen array new keywordiga pointerisse ning siis memcpy'n selle array kuhugi ning saan teise pointeri, kas siis selle teise array peal võib delete[] kasutada?


Ei soovita, v.a. juhud kui sa täpselt tead mida sa teed. Objekt ei ole tuimad andmed ja seda ei tasu kopeerida memcpy-ga. Konstruktoreid ei kutsuta välja ja jälle pole sa Kansases.

Üldiselt C++ objektid ei seedi C mäluhaldust. Tee oma klassile copy constructor, destructor kääna virtuaalseks ning pista ta C massiivi asemel STL array sisse. Tulemus on palju ohutum.

_________________
The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions.
Kommentaarid: 38 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 34
tagasi üles
vaata kasutaja infot saada privaatsõnum
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 03.04.2012 16:58:59 vasta tsitaadiga

c++11 move operatoriga jääks kogu see nali olemata. Ei mingeid probleeme pointeritega ega ebavajalike ajutiste objektide tekitamisega icon_smile.gif

Üldiselt kui plaanid vektoris hoida vähekenegi keerukamaid objekte siis on mõttekas seal hoida (smart)pointereid, mitte otse klasse. Muidugi kui veel on sul tegu klassihierarhiaga siis sa pead kasutama pointereid nii ehk naa, et su rakendus vastu taevast ei lendaks.

_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  c++ array mälu heapis
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.