3 Stimmen

Probleme mit auto_ptr

Nehmen wir an, wir haben folgenden Code

auto_ptr<T> source() 
{
  return auto_ptr<T>( new T(1) );
}
void sink( auto_ptr<T> pt ) { }
void f()
{
  auto_ptr<T> a( source() );
  sink( source() );
  sink( auto_ptr<T>( new T(1) ) );
  vector< auto_ptr<T> > v;
  v.push_back( auto_ptr<T>( new T(3) ) );
  v.push_back( auto_ptr<T>( new T(4) ) );
  v.push_back( auto_ptr<T>( new T(1) ) );
  v.push_back( a );
  v.push_back( auto_ptr<T>( new T(2) ) );
  sort( v.begin(), v.end() );
  cout << a->Value();
}
class C
{
public:    /*...*/
protected: /*...*/
private:   /*...*/
  auto_ptr<CImpl> pimpl_;

Ich bin interessiert: Was ist gut, was ist sicher, was ist legal, und was ist nicht in diesem Code? wie ich über auto_ptr weiß, ist das, zum Beispiel folgender Code

#include <iostream>
#include <memory>
using namespace std;

int main(int argc, char **argv)
{
    int *i = new int;
    auto_ptr<int> x(i);
    auto_ptr<int> y;

    y = x;

    cout << x.get() << endl; // Print NULL
    cout << y.get() << endl; // Print non-NULL address i

    return 0;
}

Dieser Code gibt eine NULL-Adresse für das erste auto_ptr-Objekt und eine Nicht-NULL-Adresse für das zweite aus, was zeigt, dass das Quellobjekt die Referenz während der Zuweisung (=) verloren hat. Der rohe Zeiger i in diesem Beispiel sollte nicht gelöscht werden, da er von dem auto_ptr-Objekt gelöscht wird, dem die Referenz gehört. Tatsächlich könnte new int direkt an x übergeben werden, wodurch die Notwendigkeit von i entfällt. Wie kann ich feststellen, welche Zeile in meinem Code sicher ist und welche nicht?

6voto

D_E Punkte 1186
vector<auto_ptr<T>> v;
v.push_back(auto_ptr<T>( new T(3) ));
v.push_back(auto_ptr<T>( new T(4) ));
v.push_back(auto_ptr<T>( new T(1) ));

Die Norm verbietet dies vollständig.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X