我什么时候应该使用新的智能指针

时间:2018-05-05 23:15:30

标签: c++

我阅读了以下代码

student* input(string name, int age)
{
  student *st = new student(name,age);
  return st;
}

其中student只是一个简单的类,具有以下函数和成员

class student{

  public:
    student(string na, int ag);
    void show();
  private:
    string name;
    int age;
};

show只是打印句子的功能。主要功能如下

int main(){
  student *st = input("guagua",25);
  if(!st){ cout<<"no pointer"<<endl;}
  st->show();
  delete st;
  return 0;
}

我的理解是因为我使用new所以在main函数中我需要删除st。如果我使用以下代码代替student *st = new student(name,age);,是否仍需要删除st

  student te(name,age);
  student *st;
  st = &te;

如果不是因为现在st是原始指针,为什么人们需要new?我们都可以使用类似的方法取代new。 另一个问题是有些人建议使用智能指针以避免我们忘记删除指针。然后我只是在上面的每个地方使用原始指针,似乎我们根本不需要delete?我知道必须有一些我不理解的地方,希望你能帮助我。感谢

1 个答案:

答案 0 :(得分:3)

  

我的理解是因为我在main函数中使用new,所以我需要删除st

这是正确的。

  

如果我使用以下代码取代学生* st =新学生(姓名,年龄);我还需要删除st吗?

student te(name,age);
student *st;
st = &te;

没有。你可能会崩溃。请记住,堆栈值在其范围之后被销毁。在此代码中,te将在函数返回后死亡。 st将指向一个死对象。

  

另一个问题是有些人建议使用智能指针以避免忘记删除指针。

事实上,除非你做一些特别的事,否则你不应该newdelete。您可以使用智能指针轻松逃脱,而不会造成任何运行时损失您使用std::unique_ptr(一个独特的所有者,许多观察者)的示例将如下所示:

std::unique_ptr<student> input(string name, int age) {
    // auto is std::unique_ptr<student>
    auto st = std::make_unique<student>(name,age);
    return st;
}

int main() {
    // auto is std::unique_ptr<student>
    auto st = input("guagua",25);

    if(!st){
        std::cout << "no pointer" << std::endl;
    }

    st->show();
    // delete st; // no delete to do
    return 0;
}

更好的是,如果你能用值来做,你根本就不需要动态内存管理或唯一指针:

student input(string name, int age) {
    student st{name, age};
    return st;
}

int main() {
    // auto is student
    auto st = input("guagua",25);

    // The following is not needed, a value is never null
    //if(!st){
    //    std::cout << "no pointer" << std::endl;
    //}

    st.show();

    // delete st; // no delete to do
    return 0;
}