Speicherverwaltung selbstgeschriebener Deque
-
Hi,
ich möchte eine Deque selbst schreiben und es hängt bereits am Ctor.template < typename T> CdequeElem<T>::CdequeElem() : prev_(0), next_(0) { T *p(0); // Versuch Speicher zu allokieren try { p = new T[min_alloc_]; if(!p) throw bad_alloc(); } catch(...) { delete p; throw; } // Member setzten beg_ = p; end_ = (p + min_alloc_); first_ = last_ = (p + min_alloc_ / 2); }Folgendes Asserts in der main schlagen alle fehl. Auch die Ausgabe der Speicheradresse zeigt beim Vergleich völlig unterschiedliche Werte.
Was läuft schief?int main() { // Tests auf CdequeElem swe3::CdequeElem<int> *pt; assert(pt->prev_ == 0 && pt->next_ == 0); assert(pt->beg_ < pt->end_); cout << "last:" << pt->last_ << " first:" << pt->first_ << endl; assert(pt->last_ == pt->first_); return 0; }
-
Danke hat sich erledigt. Hatte nur einen Pointer auf das Element, aber kein Element selbst erzeugt

-
?!
try { p = new T[min_alloc_]; if(!p) throw bad_alloc(); } catch(...) { delete p; throw; }... Du testest p auf new ... da kommst du nicht hin

try { p = new T[min_alloc_](); } catch (std::bad_alloc const& ex) { throw; }...
-
(D)Evil schrieb:
... Du testest p auf new ... da kommst du nicht hin

du musst in der tat an deinen formulierungen arbeiten...abgesehen davon @OP:
// Versuch Speicher zu allokieren try { p = new T[min_alloc_]; if(!p) throw bad_alloc(); } catch(...) { delete p; throw; }damit allokierst du nicht nur speicher, sondern konstruierst auch gleich noch
min_alloc_fertige objekte vom typ T. das wird spätestens dann fehlschlagen, wenn T sich nicht einfach so konstruieren lässt.
-
queer_boy schrieb:
du musst in der tat an deinen formulierungen arbeiten...Er meint damit das new niemals 0 zurückgibt sondern sofort eine bad_alloc exception wirft. Deshalb erübrigt sich das
if(!p) throw bad_alloc;