2012-03-30 10 views
3

annehmen, dass haben wir folgenden CodeFragen auf auto_ptr

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 gut ist, was sicher ist, was legal ist und was nicht in diesem Code? , wie ich über auto_ptr wissen ist, dass zum Beispiel folgenden 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 eine NULL-Adresse für das erste auto_ptr-Objekt und einige Nicht-NULL-Adresse für die zweite zeigt, druckt, dass die Objektquelle die Referenz verloren während der Aufgabe (=). Der rohe Zeiger i im Beispiel sollte nicht gelöscht werden, da er von der auto_ptr gelöscht wird, die die Referenz besitzt. In der Tat könnte neue int direkt in x übergeben werden, wodurch die Notwendigkeit für i. Wie kann ich feststellen, welche Zeile in meinem Code sicher ist, was nicht?

+5

'auto_ptr' gilt als veraltet. Verwenden Sie 'unique_ptr' und' shared_ptr' –

+0

Haben Sie versucht, zu kompilieren? –

Antwort

6
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))); 

Der Standard verbietet dies vollständig.