为什么要使用智能指针? 特别是智能指针使用时,如果使用C++中的指针,为什么要使用智能指针?例如: class Object { } smart_pointer < Object > pInstance; //wherein I can use the very simple way Object instance; 类对象{} 智能指针pInstance; //我可以用非常简单的方法 对象实例;

为什么要使用智能指针? 特别是智能指针使用时,如果使用C++中的指针,为什么要使用智能指针?例如: class Object { } smart_pointer < Object > pInstance; //wherein I can use the very simple way Object instance; 类对象{} 智能指针pInstance; //我可以用非常简单的方法 对象实例;,c++,smart-pointers,C++,Smart Pointers,当您需要维护对象的所有权时,智能指针非常有用。使用它们将确保适当的销毁。当指针被视为引用时,使用智能指针有时会变得更糟糕(例如,在性能方面) 指针是C++的重要组成部分,但使用C++的智能语言中,指针的移动语义要简单得多(这基本上使代码< UngQuyPPTR >成为可能。这就是为什么在现代代码中,您应该始终使用std::unique_ptr或std::shared_ptr(如果可用) 编辑:您要求提供一个示例,其中可以使用指针。我能想到的最常见的问题是某个系统的可选组件。该组件将使用大量内

当您需要维护对象的所有权时,智能指针非常有用。使用它们将确保适当的销毁。当指针被视为引用时,使用智能指针有时会变得更糟糕(例如,在性能方面)

指针是C++的重要组成部分,但使用C++的智能语言中,指针的移动语义要简单得多(这基本上使代码< UngQuyPPTR <代码> >成为可能。这就是为什么在现代代码中,您应该始终使用

std::unique_ptr
std::shared_ptr
(如果可用)


编辑:您要求提供一个示例,其中可以使用指针。我能想到的最常见的问题是某个系统的可选组件。该组件将使用大量内存,因此您不希望总是分配它,也不希望控制它的分配(因此它本身不能处于“空”状态,即不可为空)。Boost.Optional和C++14 ish
std::Optional
分配大小为T的内存,因此它们不会这样做。使用指针,您可以选择分配该内存:

class Outer { 
    std::unique_ptr<BigInner> optionalComponent;
public:
    void initializeOptionalComponent() { 
        optionalComponent = new BigInner();
    }
    void useOptionalComponent() {
        if (!optionalComponent)
            // handle the error
        // operate
    } 
};
类外部{
std::唯一的ptr可选组件;
公众:
void initializeOptionalComponent(){
optionalComponent=新的BigInner();
}
void useOptionalComponent(){
如果(!可选组件)
//处理错误
//操作
} 
};
这将解决问题,但会引入另一个明显的问题:optionalComponent可以为null,这要求所有使用它的函数始终检查有效状态。如果它是纯值成员,它将(或至少应该)始终处于有效状态。因此,如果您不需要指针,则根本不使用它,请使用
vector
和普通成员


无论如何,在这种情况下使用智能指针允许您保持零规则;您不必编写析构函数、复制构造函数或赋值运算符,类将安全地运行。

快速回答:智能指针对于

  • 强制执行
  • 管理指针所有权
强制执行RAII

指针带来的一个问题导致程序崩溃(在很多方面,一些明显的,一些扭曲的),那就是你要对指针下面的内存负责。这意味着,当您动态分配内存(通过
new
)时,您将负责此内存,并且一定不要忘记调用
delete
。这意味着它会发生,更糟糕的是,在某些情况下,即使您没有忘记,delete语句也永远不会到达。 考虑这个代码:

void function(){
    MyClass* var = new MyClass;

    //Do something

    delete var;
}
现在,如果此函数在到达delete语句之前抛出异常,指针将不会被删除。。。内存泄漏

RAII是一种避免这种情况的方法:

void function(){
    std::shared_ptr<MyClass> var(new MyClass);

    //Do something

    //No need to delete anything
}
如果不编译,您将从编译器中得到一些类似于
无法实例化抽象类的东西

但这是合法的(同时
ImplA
ImplB
公开继承自
MyAbstract

MyAbstract* varA = new ImplA;
MyAbstract* varB = new ImplB;

varA->doVirtual(); //Will call ImplA implementation
varB->doVirtual(); //Will call ImplB implementation

delete varA;
delete varB;

“C++中的指针被禁止使用”。如果你不能使用指针,多态性将如何工作?指针是必需的,智能指针使指针的使用更安全/更容易/更好。只有在必要时才使用指针。当你这样做时,尝试使用智能指针而不是原始指针。在附加代码示例时,至少附加有效代码。不幸的是,静态分配的对象g首选和默认方式在所有情况下都是不够的,例如难以定义对象生存期的情况(不直接绑定到函数调用或其他对象的生存期),或者当需要动态多态性时。在这种情况下,动态内存分配通常是解决此问题的最佳方法,并通过智能指针使其变得更加简单和安全。向下投票是问题可能出问题的迹象;它们决不是针对个人的,也不是为了阻止您。您可能需要查看常见问题解答and关于页面,以确保你的问题是正确的。你能给我一个例子,其中我应该包装与智能指针的对象与否。在我的例子上面。
MyAbstract* varA = new ImplA;
MyAbstract* varB = new ImplB;

varA->doVirtual(); //Will call ImplA implementation
varB->doVirtual(); //Will call ImplB implementation

delete varA;
delete varB;