visual studio || minnesallokering c++ || teori inte direkt praktik

Permalänk
Medlem

visual studio || minnesallokering c++ || teori inte direkt praktik

Hejsan SweC.

Så jag sitter med visual studio 2010 professional, kollar egenom en bit kod som inte kan dela med mig av tyvärr. Men konceptuellt ser den ut så här:

void funk(/*args...*/){ char* p_mem = new char[256]; /* ... some code.... */ delete p_mem; }

Nu vet jag inte hur noga ni kollade på koden men det som står är ju new[] och delete. För någon anledning så säger inte visual studio till (jag är väldigt ny i visual studio världen använder vanligen clang/gcc) jag är rätt säker (ska inte svära på det) att i gcc och clang hade du aldrig gått göra det utan ett error eller två, men detta program går att göra och får inte ens klagomål på den där. Enligt standard ska det se ut så här:

voi funk(/*args...*/){ char* p_mem = new char[256]; /* ... some code.... */ delete[] p_mem; }

Så till mina frågor:
Hur löser visual studio att man allokera array men delete vanlig mem yta?
Löser visual studio det hela själv i backgrunden? eller är det en källa till minnes läcka?

Tack för svar!

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
Skrivet av asdfgh:

Hur löser visual studio att man allokera array men delete vanlig mem yta?
Löser visual studio det hela själv i backgrunden? eller är det en källa till minnes läcka?

Att använda delete istället för delete[] när minnet allokerats av new[] ger odefinierat beteende, se C++ FAQ. Så programmet kan läcka minne, krascha, eller vad som helst egentligen.

Detta är alltså inget annat än ett fel som Visual Studio inte kontrollerar. Det kanske är möjligt att det går att ställa in Visual Studio att göra det, men generellt är det svårt (om inte omöjligt) för kompilatorn att hålla reda på vilket minne som allokerats med new och vilket som allokerats med new[]. GCC kompilerar för övrigt sån här kod utan någon varning ens med -Wall, medan Clang faktiskt ger en varning för det utan några extra flaggor.

Permalänk
Medlem
Visa signatur

C#/MonoGame Fanatiker.
Pixel Artist & Game Developer

Permalänk
Datavetare

Som redan nämns är huvudproblemet att ett sådant program har odefinierat beteende.

Den stora skillnaden mellan new[]/delete[] och new/delete är att den förra också kommer köra konstruktorn/destruktorn för varje element om du allokerar en array.

Om det du har i din array har en icke-trivial dtor som också friar resurser är en läcka rätt garanterad.

Men som redan påpekats: det är odefinierat beteende, så programmet är felaktigt och kan egentligen göra vad som helst.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer