我看了一些代码,它说使用“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?
答案 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;
}