[C++] Speicher reservieren als Funktion

Bumbbleman

Erfahrenes Mitglied
Hallo,
Ich hätte nur gerne eine zweite oder auch dritte Meinung eingeholt
bevor ich mir noch den Speicher fragmentiere.

Ich wollte mir eine Funktion schreiben, die für mich den Speicher reserviert, weil es manchmal schon ziemlich viel Schreibkram wird.
Eigentlich müsste das doch gehen.
Ich übergebe der Funktion einen Null-Zeiger und die Anzahl des Index.
In etwa so:
(Die funktion:)
C++:
void SpeicherReservieren(int * var, int index)
  try
  {
	var = new int[index];
  }
  catch ( bad_alloc & e)
  {
  }
Der Quellcode:
C++:
#include <iostream>
using namespace std;

int main()
{
int * a = 0;

SpeicherReservieren(a,5);

          /*....hier macht man dann irgend etwas
  und am Ende leert man den Zeiger und gibt den Speicher wieder frei*/

delete[] a;

return 0;
}
(Und die Funktion könnte man dann noch schön überladen ;) )
Geht das so? Oder fragmentier ich mir den Speicher?
Ich bin mir aber ziemlich sicher, dass das klappen müsste, weil ich ja mit Zeigern arbeite.

mfg
 
Zuletzt bearbeitet:
Moin,

ob sich das so überhaupt compilieren lässt, weiß ich nicht, da ich es noch nie versucht habe - theoretisch ja!

Allerdings würde ich persönlich das so nie handhaben, sonden das new/delete immer in den gleichen Kontext stellen, da mir andernfalls die Gefahr viel zu groß wäre, Speicherlecke zu produzieren, weil man bspw. das delete vergisst !!

In Bezug auf die von Dir genannte Fragmentierung ist es eh' egal, da Du keinen wirklichen Einfluss darauf hast, welcher Teil Deines Speicher hier allokiert wird! Ob also das new innerhalb der Funktion aufgerufen wird oder statt ihrer, dürfte IMHO egal sein !

Gruß
Klaus
 
Hi.

@Bumbleman: Was hättest du denn damit gewonnen?

Zuerst ist die Definition der Funktion falsch, du hast dort ein Speicherleck.

Wenn es dir nur darum geht die bad_alloc Ausnahme zu unterdrücken (macht das denn überhaupt immer Sinn?), dann verwende doch die nothrow Versionen von new/new[].

Im Grunde würdest du nur versuchen den new[] Operator durch eine Funktion auszudrücken (was ja eigentlich das gleiche ist). Ich sehe da keinen Nutzen.

Gruß
 
Hallo,

Falls du es wirklich machen willst sollte deine Funktion aber so aussehen:
C++:
void SpeicherReservieren(int ** var, int iSize)
{
	try
	{
		*var = new int[iSize];
	}
	catch ( bad_alloc & e)
	{
		...
	}
}

oder wie ich finde noch einfacher:

{gelöscht}

Natürlich würde das ganze nur was bringen, wenn die Funktion dann das Programm beenden würde oder ähnliches.

{... ebenfalls gelöscht}

Gruß
Anfänger

Edit:
Neej das muss keiner lesen was ich da oben verzapft habe ... *g*
 
Zuletzt bearbeitet von einem Moderator:
oder wie ich finde noch einfacher:
C++:
int* SpeicherReservieren(int iSize)
{
	int *mem = new int[iSize]
	if(!mem)
	{//Fehler
		...
	}
	return mem;
}
Was nicht funktionieren würde, da new eine std::bad_alloc Ausnahme wirft und die if Anweisung in dem Fall nie ausgeführt werden würde.
Naja. Und übringens würde delete[] nen Fehler erzeugen. Hier ist einfach nur delete zu benutzten.
Das ist falsch. Zu new[] gehört ein delete[].

Gruß
 
Zuletzt bearbeitet von einem Moderator:
Edit:

Ok du hast vollkommen recht... hab mir da die vergangenen Jahre ziemlichen mist angewöhnt.

Naja jetzt bin ich schlauer.

*Ungläubig mit dem Kopf schüttel*

Gruß
Anfänger
 
Zuletzt bearbeitet:
Wir hier prüfen nämlich auch an x Stellen nur auf null ...
Habe dazu bei MS folgendes gefunden:
http://support.microsoft.com/kb/167733/de

Gilt das vlt. nur für ältere Versionen ?
Das steht doch im verlinkten Artikel:
Das ist ein Fehler in der Implementierung Microsoft von New-Operator dawie in Konformität in nicht mit dem ANSI C++ Standard.
[...]
Die Informationen in diesem Artikel beziehen sich auf:
  • The C Run-Time (CRT), wenn verwendet mit:
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ 2005 Express Edition
    • Microsoft Visual C++ .NET 2003 Standard Edition
    • Microsoft Visual C++ .NET 2002 Standard Edition
In Visual C++ 2008 (SP1) wird korrekt ein bad_alloc geworfen.

Grüße, Matthias
 
Hallo Matthias,

oops - Danke für den Hinweis :p

Dabei ist doch heut noch gar nicht so heiß ... sollte wohl besser Feierabend machen ^^

tschüss
Klaus
 
Zurück