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?
'auto_ptr' gilt als veraltet. Verwenden Sie 'unique_ptr' und' shared_ptr' –
Haben Sie versucht, zu kompilieren? –