Передать указатель на auto_ptr с C ++ - PullRequest
0 голосов
/ 10 февраля 2011

У меня есть функция, которая делает это:

static MyClass* MyFunction(myparams)
{
    return new MyClass(myparams)
}

, и я мог бы вызвать эту функцию внутри другой, которая имеет следующую подпись:

void MyFunction2(std::auto_ptr<MyClass> myparam)

, но когда япопробуйте сделать это у меня ошибка компилятора:

Невозможно преобразовать первый параметр из MyClass * в std :: auto_ptr <_Ty>

почему?Спасибо за любую помощь

РЕДАКТИРОВАТЬ 1 Как и было задано, типы myparams нормальны, но есть и параметр T, поскольку функция находится внутри класса шаблона

Ответы [ 3 ]

9 голосов
/ 10 февраля 2011

std::auto_ptr<> имеет явный конструктор, как и любой другой умный указатель.Это означает, что не существует неявного преобразования из T* в std::auto_ptr<T>, чтобы предотвратить случайное удаление объекта.Следовательно, вам необходимо преобразовать необработанный указатель в std::auto_ptr<> в явном виде:

MyFunction2(std::auto_ptr<MyClass>(MyFunction()));

Также рекомендуется сделать так, чтобы ваши фабричные функции возвращали умный указатель вместо необработанного указателя, это делаетЧитатель, что право собственности на объект передается вызывающей стороне:

static std::auto_ptr<MyClass> MyFunction(myparams)
{
    return std::auto_ptr<MyClass>(new MyClass(myparams));
}
0 голосов
/ 10 февраля 2011

Возможно, вы захотите вызвать функцию MyFunction2 следующим образом ...

void f() {
    MyClass* directptr = MyFunction(myparams);
    std::auto_ptr<MyClass> p(directptr);
    MyFunction2(p);
    cout << p.get() << endl; // Prints NULL!
}

Однако, когда MyFunction2 заканчивается, экземпляр MyClass будет удален, а при получении p будет иметь значение NULL.и directptr будет указывать на удаленный объект.

0 голосов
/ 10 февраля 2011

Нет неявного преобразования из необработанного указателя в auto_ptr. Просто откровенно закажите:

MyFunction2(std::auto_ptr(MyFunction(params)));

Обратите внимание, что выделенная памятка будет уничтожена после вызова MyFunction2, потому что временная auto_ptr исчезнет, ​​освободив ее.

...