一,auto_ptr类的作用:
1.获取资源
2.处理一些操作
3,释放资源
一个简单的例子:
void f()
{
ClassA* ptr = new ClassA; //create an object explicitly
try {
... //perform some operations
}catch (...) //for any exception
{ delete ptr; //-clean up
throw; //-rethrow the exception
}
delete ptr; //clean up on normal end
}
在这种情况下我可以用auto_ptr来简化:
void f()
{
//create and initialize an auto_ptr
std::auto_ptr<ClassA> ptr(new ClassA);
... //perform some operations
}
二,auto_ptr的管理权。
auto_ptr在发生拷贝构造函数和赋值操作时,会发生资源的管理器的转移,例如;
std::auto_ptr<ClassA> ptr1(new ClassA);
std::auto_ptr<ClassA> ptr2; //create another auto_ptr
ptr2 = ptr1; //assign the auto_ptr,transfers ownership from ptr1 to ptr2
在赋值操作中,右值一定要是一个auto_ptr类型,不能是一个平常的指针,例如:
std::auto_ptr<ClassA> ptr; //create an
ptr = new ClassA; //ERROR
ptr = std::auto_ptr<ClassA>(new ClassA); //OK, delete oldobjectand own new Source。
所以我们把auto_ptr作为函数参数或是返回值(都是by value)有一定的威胁性。如果不打算转移管理权,就不要做。
我们会想传引用,但是那是很迷惑的,因为它不传递管理权,所以要总是避免这样做。
我们可以Const auto_ptr来避免这种非故意性的错误。不要因为是Const auto_ptr而认为不能改变Const auto_ptr的资源的值。
三,应用
在构造函数里避免内存泄露可以用到auto_ptr,详细请见:<<More Effective c++>>
四种情况不要使用auto_ptr:
1.多个auto_ptr不要共享多个资源
2,auto_ptr不要给数组提供服务
3,auto_ptr不是全能的智能指针,它不能在引用计数(详细请见:<<More Effective c++>>)中数用。
4,auto_ptr不能满足容器的元素的要求。
1.获取资源
2.处理一些操作
3,释放资源
一个简单的例子:
void f()
{
ClassA* ptr = new ClassA; //create an object explicitly
try {
... //perform some operations
}catch (...) //for any exception
{ delete ptr; //-clean up
throw; //-rethrow the exception
}
delete ptr; //clean up on normal end
}
在这种情况下我可以用auto_ptr来简化:
void f()
{
//create and initialize an auto_ptr
std::auto_ptr<ClassA> ptr(new ClassA);
... //perform some operations
}
二,auto_ptr的管理权。
auto_ptr在发生拷贝构造函数和赋值操作时,会发生资源的管理器的转移,例如;
std::auto_ptr<ClassA> ptr1(new ClassA);
std::auto_ptr<ClassA> ptr2; //create another auto_ptr
ptr2 = ptr1; //assign the auto_ptr,transfers ownership from ptr1 to ptr2
在赋值操作中,右值一定要是一个auto_ptr类型,不能是一个平常的指针,例如:
std::auto_ptr<ClassA> ptr; //create an
ptr = new ClassA; //ERROR
ptr = std::auto_ptr<ClassA>(new ClassA); //OK, delete oldobjectand own new Source。
所以我们把auto_ptr作为函数参数或是返回值(都是by value)有一定的威胁性。如果不打算转移管理权,就不要做。
我们会想传引用,但是那是很迷惑的,因为它不传递管理权,所以要总是避免这样做。
我们可以Const auto_ptr来避免这种非故意性的错误。不要因为是Const auto_ptr而认为不能改变Const auto_ptr的资源的值。
三,应用
在构造函数里避免内存泄露可以用到auto_ptr,详细请见:<<More Effective c++>>
四种情况不要使用auto_ptr:
1.多个auto_ptr不要共享多个资源
2,auto_ptr不要给数组提供服务
3,auto_ptr不是全能的智能指针,它不能在引用计数(详细请见:<<More Effective c++>>)中数用。
4,auto_ptr不能满足容器的元素的要求。