2010-10-10 16 views
5

Ich habe mit einigen C-Code als Schnittstelle von C++ Klassenkonstruktor (Intel-Bibliothek)Malloc in C++ Konstruktor


    class A{ 
    A{ 
    x = ippiMalloc(); 
    if(x==NULL) ... 
    } 
    } 

im Konstruktor malloc-Funktion (Intel-Version) verwendet wird. Wenn die ippiMalloc-Funktion nicht erfolgreich ist, ist die richtige Vorgehensweise. Ausnahmebedingung?

+0

Welche Bibliothek ist das? – rkellerm

+0

Ippi (Integrated Performance Primitives) – Ross

+1

Warnung, wenn Sie neu sind: Wenn ein intelligenter Zeiger eines Drittanbieters mit der gewünschten Besitz-Semantik verfügbar ist, vielleicht 'shared_ptr', dann verwenden Sie diesen anstelle eines rohen Zeigers. Andernfalls sollte A eine Klasse sein, die nur dazu dient, die Zuweisung und Freigabe von "x" zu verwalten. Dies ist nicht nur luftig-fair "Trennung von Bedenken ist eine gute Praxis": Es ist erstaunlich peinlich, eine ausnahmesichere Klasse zu schreiben, die für die Verwaltung von mehr als einer Ressource verantwortlich ist, und ein bisschen fummelig sogar mit nur einer ... –

Antwort

8

Ja, eine Ausnahme wäre wahrscheinlich der geeignetste Weg, um den Fehler hier zu behandeln - zumindest wäre es der sauberste Weg. Dies ist auch, was der "neue" Operator bei einem Fehler tun würde.

Wenn Ihre App keine Ausnahme kennt, haben Sie ein Problem. In diesem Fall könnte eine Factory-Methode für die Klasse sinnvoll sein.

static A * create() { ... } 

Hier können Sie dies in ein Programm ohne Ausnahme einbinden, das wahrscheinlich null zurückgibt, wenn Sie das Objekt nicht erstellen können.

+0

Wenn Ihre App nicht return-null ist, haben Sie nur Probleme eingeführt, anstatt sie zu entfernen. – MSalters

+0

Wenn Ihre App keine Ausnahme ist, muss sie/Rückgabewerte überprüfen. Sie haben wirklich keine andere Option: Ausnahmen und/oder Rückgabewerte. –

4

Zuerst Klammern hinzufügen, um den Konstruktor :) Und ja, würde ich für das Auslösen einer Ausnahme stimmen, weil die Alternativen nicht sehr angenehm sind, wie einige Bool in der Klasse wie object_state_is_not gültig oder etwas.

1

Bei der Verknüpfung der vorherigen Antworten - und here ist eine gute Erklärung dafür, warum Ausnahmen der beste Weg zur Fehlerbehandlung in Konstruktoren ist. (C++ FAQ Lite)