new(std::nothrow) und Borland Codeguard
-
hi,
wenn ich *int a = new(std::nothrow) int[100]; aufrufe und das ganze dann mit delete [] a wieder freigebe, meldet mir Borlands Codeguard einen "resource type mismatch"! ohne nothrow läuft alles reibungslos.
kann mir das jemand erklären?
wenn ich den speicher stattdessen mit free(a) freigebe, kommt keine fehlermeldung.
-
Versuchs mal bei google.
-
Das mit free ist ne blöde Idee, zu new gehört delete. Ansonsten, der g++ übersetzt mir das hier ohne Probleme:
#include <new> int main() { int *a = new(std::nothrow) int[100]; delete[] a; }
Von daher nehme ich an, dass dein Borland-Compiler einfach zu alt ist, den nothrow-Kram zu kennen. Schreib halt statt
int *a = new(std::nothrow) int[100]; if(a == 0) { // Allokation fehlgeschlagen } else { // Allokation hingehauen delete[] a; }
einfach
int *a; try { a = new int[100]; // Allokation hingehauen delete[] a; } catch (std::bad_alloc e) { // Allokation fehlgeschlagen }
-
@ Oxdeadbeef:
Codeguard hilft einem beim aufspüren von memory leaks. Das hat nix mit dem Compiler zu tun. Codeguard kommt nur damit nicht klar.
MfG
-
mit std::bad_alloc mache ich es ja jetzt auch, ich wollte mir aber das try und catch sparen, der laufzeit wegen
-
Wiedermal der Versuch C++ ohne C++(Exceptions) zu programmieren.
Wenn du deinen Algorithmus optimierst kannst du garantiert mehr Performance
gutmachen als mit solchen Winkelzügen.
-
Chew-Z schrieb:
Wiedermal der Versuch C++ ohne C++(Exceptions) zu programmieren.
Wenn du deinen Algorithmus optimierst kannst du garantiert mehr Performance
gutmachen als mit solchen Winkelzügen.tss, fuer mich gehört auch sowas zur optimierung... wozu ne exception abfangen, wenn es die möglichkeit gibt, nen null-zeiger auszuwerten?
-
Mit dem Unterschied, dass du den Nullpointer bei jedem new prüfen musst, während du im ganzen Programm nur einen einzigen catch(bad_alloc)-Block brauchst
Es sei denn du hast einen ausgeklügelten Plan, auf jedes fehlgeschlagene new individuell zu reagieren.
Woher bist du dir eigentlich so sicher, dass bad_alloc soviel Laufzeit kostet, dass du da mit optimieren anfängst?