C/C++ pointer i externt "projekt"

Permalänk
Medlem

C/C++ pointer i externt "projekt"

Hej SweC.

Så jag sitter och letar en minnes läcka i ett projekt som jag gjorde för några år sedan med några andra. Jag har tänkt som så här att vi ha en pekare som tilldelas av ett externt projekt (metod), när vi då stänger det externa projektet (som tar bort minnes allokeringen (delete obj)) så av-allokeras minnet i detta projekt för den pekaren också. Men jag börja misstänka att jag har fel. Exempel:

int main(){ int *data; bool error = test(&data) // extern deklaration: extern short "externprjName" test(**d); if(error) printErrorMsg(error); while(test){ //code... if(exit) //extern closing method on data. } return 0; }

Tyvärr kan jag inte säga mycket mer :/

Alla svar uppskattas.

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Medlem

Känns som mer information behövs. Hur vet du att det är en minnesläcka?

Känns som det är flera fel i din exempel-kod. Bl.a. borde nog while-loopen utvärdera pekaren data istället för funktionen test:

while(test) {

Sen antar jag att data sätts till nullptr inom if(exit)?

Skickades från m.sweclockers.com

Visa signatur

..:: RiJo ::..
Computer: Lenovo X300
Platform: Gentoo

Permalänk
Hedersmedlem

Det gäller ju att det externa projektet har en destruktor eller någon metod som avallokerar minnet då. Nu har jag jobbat i projekt där man undvikit dynamisk allokering men man brukar väl ha som tumregel en free för varje alloc och en delete för varje new?

Förvänta dig ingen magisk garbage collection.

Permalänk
Medlem

Shimonu jag vet ej om det är min beskrivning eller vad som förklara fel. Men i det externa "biblioteket" sköts new/delete i constructor, add, destructor och remove. Men min fråga var att, jag har alltid antagit att om jag skickar in en pekare i externa funktion och sedan när jag stänger/kalla en avslutnings metod (om de externa är gjort rätt) så behöver inte jag köra delete i mitt då det körs i externa. Men jag tänkte bara kolla om jag hade fel eller ej.

Ja, det dät exemplet är dåligt RiJo. Kanske skulle skriva om det lite.

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Medlem

Jag är ingen C++ guru men när jag jobbar i C så brukar dubbelpekare betyda att du får tillbaks en pekare till en allokerad minnesrymd.
Dvs. du är ansvarig för att göra free på data.

Visa signatur

Rig 1: 13600KF, Prime Z790-A Wifi , EVGA GTX1080Ti, 32GB DDR5

Rig 2: E5-2680 v3, Asus X99-E, 2x GTX970, 32GB DDR4

Permalänk
Hedersmedlem
Skrivet av asdfgh:

Shimonu jag vet ej om det är min beskrivning eller vad som förklara fel. Men i det externa "biblioteket" sköts new/delete i constructor, add, destructor och remove. Men min fråga var att, jag har alltid antagit att om jag skickar in en pekare i externa funktion och sedan när jag stänger/kalla en avslutnings metod (om de externa är gjort rätt) så behöver inte jag köra delete i mitt då det körs i externa. Men jag tänkte bara kolla om jag hade fel eller ej.

Ja, det dät exemplet är dåligt RiJo. Kanske skulle skriva om det lite.

Det är ju precis vad du måste få klart för dig. Nu är det exempel extremt otydligt så det blir svårt att få något kontext. Men får du tillbaka dynamiskt skapade objekt av ett bibliotek så kan det mycket väl vara så att du behöver släppa det minnet själv. Ett proffsigt lib bör göra det tydligt via någon manual. Har du problem med minnesläckor känns det fullt möjligt att du behöver frigöra det själv, speciellt om du antagit motsatsen

Det är väl lite vad @bregell är inne på. Skulle det skötas av biblioteket så skulle den behöva spara alla pekare den någonsin returnerar i en intern struktur vilket jag har svårt att föreställa mig att det skulle göra.