c++ - 何时将 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 可见?
解决方案
在此示例中,对象已创建并仍存在于内存中,但您不再拥有指向它的指针。
原因是st
超出了范围,input
因此指针的值(对象所在的位置)丢失了。
函数中的st
inmain
尚未在该范围内声明,因此它不存在。
因此,在此示例中,您需要使用以下内容返回指针:
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;
}
推荐阅读
- php - 如何根据groupby Mysql Php获取和合并数据
- windows - 如何水平而不是垂直显示 PowerShell 结果?
- botframework - MS Teams & Bot Framework:操作按钮似乎不适用于自适应卡,从消息扩展发送到跨组织租户
- node.js - Firestore 简单的“获取”查询在云功能中需要 10 秒
- ionic-framework - 我们可以在 PROD 中查看离子应用程序的日志(信息)吗?
- excel - 通过VBA为一列中的每个单元格添加符号
- spring-webflux - SpringBoot 2.5.1 WebFlux 设置 Flux UTF-8 编码
- c - 为什么`1<<32 - 1`是4294967295?
- python - post() 缺少 3 个必需的位置参数:“user”、“user_obj”和“code”
- html - 设置列表分隔符长度