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;
    

Anmelden zum Antworten