如果我需要多态性,我应该使用原始指针而不是unique_ptr
If I need polymorphism should I use raw pointers instead of unique_ptr?
如果我需要多态性,我应该使用原始指针而不是unique_ptr
吗?
我看到一些线程显示了如何使用unique_ptr
进行多态行为。我不确定这是否值得麻烦,我宁愿留在原始指针上。您能否对此发表评论,您在这种情况下对原始指针与智能指针的看法?
下面的简单代码表明,从多态性的角度来看,std::unique_ptr
工作得很好,打印"Hello from Derived."
。
#include <iostream>
#include <memory>
using std::cout;
struct Base
{
virtual ~Base() { }
virtual void SayHello()
{
cout << "Hello from Base.n";
}
};
struct Derived : public Base
{
void SayHello() override
{
cout << "Hello from Derived.n";
}
};
int main()
{
std::unique_ptr<Base> pBase( new Derived() );
// Or using std::make_unique:
//
// std::unique_ptr<Base> pBase = std::make_unique<Derived>();
pBase->SayHello();
}
无论如何,观察原始指针是可以的;你必须注意的是拥有原始指针。拥有原始指针应安全地包装在 RAII 边界内(使用 unique_ptr
、shared_ptr
或某些自定义资源管理器)。
-
使用
unique_ptr
来控制已分配资源的所有权,例如在函数内的免费存储上分配并返回unique_ptr
。 -
如果所有权不是问题,则仅使用多态行为的引用。即使
unique_ptr
执行相同的操作,也可以使编译器免于额外的工作。 -
如果所有权不是问题,请使用指针进行容器内的多态行为。不能有引用容器。
智能指针是关于所有权/生命周期的。 如果需要管理多态对象的生存期,请使用智能指针。 如果您只是使用该对象,则更喜欢原始引用/指针(按此顺序)而不是智能指针。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- 为什么 std::unique 不调用 std::sort?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针