何时为全局范围使用new

时间:2018-05-05 18:03:09

标签: c++

我看了一些代码,它说使用“​​new”的原因之一是在函数之后使指针不被销毁。例如

void input(string name, int age)
{
  student *st = new student(name,age);
  st->change();
}
int main(){
  input("guagua",25);
  if(!st){ cout<<"there is a pointer"<<endl;}
  delete st;
  return 0;
}

我有一个简单的班级学生,他的头文件看起来像这样,改变功能只是一个句子。

class student{

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

如果new分配内存,那么我应该能够看到“有一个指针”。但是,此程序无法编译,错误是

    ‘st’ was not declared in this scope

输入功能后怎样才能看到st?

1 个答案:

答案 0 :(得分:2)

在这个例子中,对象已经创建并且仍然存在于内存中,但是你不再有指向它的指针。

原因是st超出了input中的范围,因此指针(对象所在的位置)的值将丢失。

st函数中的main尚未在该范围内声明,因此它不存在。

因此,在此示例中,您需要返回指针,如:

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

然后你可以使用它:

int main(){
  auto st = input("guagua",25);
  if(!st){ cout<<"there is a pointer"<<endl;}
  delete st;
  return 0;
}

另一种选择可能是为st使用全局变量,或者使用智能指针。

std::shared_ptr通常可以替代原始指针,但如果您不需要共享所有权,则应该更喜欢使用std::unique_ptr

以下是一个例子:

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

int main(){
    auto st = input("guagua", 25);
    if(!st){ cout << "there is a pointer" << endl; }
    return 0;
}