我无法理解unique_ptr或auto_ptr的含义,众所周知,一旦参数超出其范围,我们就不会得到内存泄漏。但是,如果我在堆栈上而不是在堆上创建参数,这是一个更好的主意。我没有看到它优于正常参数的优势。如果我们真的需要在堆上创建参数,那么我们必须使用new
运算符,对吗?
这是一个小代码片段:
class Base
{
public:
Base()
{
cout << "Base::()" << endl;
}
virtual ~Base()
{
cout << "~Base()" << endl;
}
virtual void iPhone()
{
cout << "I'm iPhone5s" << endl;
}
};
class Derive : public Base
{
public:
Derive()
{
cout << "Derive()" << endl;
}
virtual void iPhone()
{
cout << "I'm iPhone 6" << endl;
}
virtual ~Derive()
{
cout << "~Derive()" << endl;
}
};
void main()
{
{
auto_ptr<Base> ptr(new Derive());//a foolish idea to do so?
ptr->iPhone();
Derive d;//isn't it better?
Base* base = &d;
base->iPhone();
}
}
答案 0 :(得分:3)
以所有权形式而不是指针来查看std::unique_ptr
和std::shared_ptr
会有所帮助:std::unique_ptr
当某些东西一次只能拥有一个所有者时,{{1什么时候可以分享。
请注意,由于C ++ 11(引入了其他智能指针)std::auto_ptr
已被弃用。
答案 1 :(得分:2)
我在回答评论中的问题而不是标题中获得了大量的投票。在评论中,您问However, is it a better idea if I create the parameter on the stack rather on the heap.
这是该问题的答案:
应始终首选自动变量,但它有限制。您可能希望动态分配仅持续范围的内存的原因是,当您要创建大型内存时,堆栈的大小有限,因此如果可能超出该大小,您可能希望在堆上创建它。
答案 2 :(得分:0)
忘记auto_ptr
。它现在已经过时了,因为它具有不同寻常的复制语义。如果您想拥有真实smart pointers
,请使用unique_ptr
或shared_ptr
。
现在,您的问题是:为什么要使用unique_ptr
?在对象A
中创建对象B
时,可以将其声明为B
类的属性。它在堆栈中,你不需要unique_ptr
。确实如此,但有时候,您的对象B
必须初始化而不 A
的实例,因为例如A
太大,或者您不要使用它。因此,您必须进行动态分配,并且有助于使用unique_ptr
来避免指向delete
。
答案 3 :(得分:0)
Consider you have:
class A { };
class B : public A { };
A* factory(bool willBeA)
{
return willBeA ? new A() : new B();
}
int main()
{
//I want to get an instance of A or maybe B depending on a value
bool val = false;
unique_ptr<A> ptr { factory(val) }; //you need having a pointer to the returned value of A
//do something
//no need for delete
return 0;
}
在这种情况下,您无法创建自动变量来存储A,因为您实际上不知道是否将使用A或B的实例。