我阅读了以下代码
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
?我知道必须有一些我不理解的地方,希望你能帮助我。感谢
答案 0 :(得分:3)
我的理解是因为我在main函数中使用new,所以我需要删除
st
。
这是正确的。
如果我使用以下代码取代学生* st =新学生(姓名,年龄);我还需要删除st吗?
student te(name,age); student *st; st = &te;
没有。你可能会崩溃。请记住,堆栈值在其范围之后被销毁。在此代码中,te
将在函数返回后死亡。 st
将指向一个死对象。
另一个问题是有些人建议使用智能指针以避免忘记删除指针。
事实上,除非你做一些特别的事,否则你不应该new
或delete
。您可以使用智能指针轻松逃脱,而不会造成任何运行时损失您使用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;
}