首页 > 解决方案 > 何时将 new 用于全局范围

问题描述

我看了一些代码,它说使用“​​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 可见?

标签: c++

解决方案


在此示例中,对象已创建并仍存在于内存中,但您不再拥有指向它的指针。

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

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

因此,在此示例中,您需要使用以下内容返回指针:

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如果您不需要共享所有权,您应该更喜欢使用 a 。

这是一个例子:

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;
}

推荐阅读