praegune kellaaeg 09.08.2025 10:16:50
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
Hazar
Kreisi kasutaja

liitunud: 24.08.2004
|
01.04.2012 22:29:04
c++ array mälu heapis |
|
|
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 |
|
 |
Supiplex
HV veteran

liitunud: 11.12.2002
|
02.04.2012 11:42:48
Re: c++ array mälu heapis |
|
|
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 |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
03.04.2012 16:58:59
|
|
|
c++11 move operatoriga jääks kogu see nali olemata. Ei mingeid probleeme pointeritega ega ebavajalike ajutiste objektide tekitamisega
Ü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 |
|
 |
|
lisa lemmikuks |
|
|
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.
|