C++ 删除后指针未设置为nullptr
我在C++ 删除后指针未设置为nullptr,c++,pointers,C++,Pointers,我在destroy student()函数中delete指针aStudent,然后将aStudent设置为nullptr。但是,在运行该函数后,aStudent不再设置为nullptr,因此我必须再次将其设置为nullptr #include <cstring> using namespace std; struct Student { char * name; float gpa; }; Student * createStudent(const
destroy student()
函数中delete
指针aStudent
,然后将aStudent
设置为nullptr
。但是,在运行该函数后,aStudent
不再设置为nullptr
,因此我必须再次将其设置为nullptr
#include <cstring>
using namespace std;
struct Student {
char * name;
float gpa;
};
Student * createStudent(const char name[], float gpa) {
struct Student * student = new Student;
student->name = (char*)malloc(strlen(name + 1)); //allocate only enough memory to fit the given name
strcpy(student->name, name);
student->gpa = gpa;
return student;
}
bool destroyStudent(Student * aStudent) {
if(aStudent) { //check whether this pointer is already null.
free(aStudent->name);
delete aStudent; // ******This is where the issue is******
aStudent = nullptr;
return true;
}
return false; //aStudent is already null
}
int main() {
Student * student1 = createStudent("Charles", 2.5);
cout << student1->name << " and " << student1->gpa << endl;
destroyStudent(student1);
if(student1) {
cout << "Pointer is NOT null!!!" << endl;
student1 = nullptr;
}
if(!student1) {
cout << "The pointer is null now." << endl;
}
return 0;
}
#包括
使用名称空间std;
结构学生{
字符*名称;
浮动gpa;
};
学生*createStudent(常量字符名[],浮点gpa){
结构学生*学生=新学生;
student->name=(char*)malloc(strlen(name+1));//只分配足够的内存来容纳给定的名称
strcpy(学生->姓名,姓名);
学生->平均成绩=平均成绩;
留学生;
}
布尔学生(学生*学生){
如果(aStudent){//检查此指针是否已为空。
免费(学生->姓名);
删除学生;//****这就是问题所在******
aStudent=nullptr;
返回true;
}
return false;//aStudent已为null
}
int main(){
学生*student1=createStudent(“Charles”,2.5);
cout name问题在于aStudent
是指针的本地副本
您需要按如下方式通过引用传入指针:
bool destroyStudent(Student*& aStudent) {
if(aStudent) { //check whether this pointer is already null.
free(aStudent->name);
delete aStudent; // ******This is where the issue is******
aStudent = nullptr;
return true;
}
return false; //aStudent is already null
}
这样,您更改的是外部指针,而不是本地副本。问题在于aStudent
是指针的本地副本
您需要按如下方式通过引用传入指针:
bool destroyStudent(Student*& aStudent) {
if(aStudent) { //check whether this pointer is already null.
free(aStudent->name);
delete aStudent; // ******This is where the issue is******
aStudent = nullptr;
return true;
}
return false; //aStudent is already null
}
这样,您更改的是外部指针,而不是本地副本。C++使用
您正在将destroyStudent()
方法的本地变量设置为nullptr
,而不是main()
中的变量
您正在将destroyStudent()
方法的本地变量设置为nullptr
,而不是main()中的变量
您正在设置指针的副本。该对象已被删除,但指针的副本被设置为null,而不是原始值。@幻影也许您应该在destroyStudent
中添加它作为回答,您可以通过值传递Student*。也许您想要bool destroyStudent(Student*&aStudent)
如果作业规范允许,您可以使用字符串来代替学生的字符*
:name@user4581301不幸的是,我们需要在所有的作业中使用字符数组而不是字符串。我不知道为什么。若我们可以使用字符串而不是char[],和向量,而不是在某些情况下的数组。您正在设置指针的副本。对象被删除,但指针的副本被设置为null,而不是原始值。@幻影也许您应该在destroyStudent
中添加它作为回答,您可以按值传递Student*。也许您想要bool destroyStudent(Student*&aStudent)
如果作业规范允许,您可以使用字符串来代替学生的字符*
:name@user4581301不幸的是,我们需要在所有的作业中使用字符数组而不是字符串。我不知道为什么。若我们可以使用字符串而不是char[],和向量,而不是数组。函数声明是由教授创建的,我们不允许以任何方式更改参数,否则教授的测试用例将失败。有没有办法在不更改函数声明中的参数的情况下完成同样的事情?@IanLing没有办法o在函数内部,如果需要,在调用函数后必须将指针设置为null。但是否需要将其设置为null?如果我没有将其设置为nullptr,则在第二次运行destroyStudent()
时会出现“双自由”错误。分配说明destroyStudent()
函数必须“删除“aStudent”指向的学生对象,并将其设置为null ptr。”@IanLing很遗憾,如果不按照我的回答中的建议更改函数签名,则无法在函数内部执行此操作。您确定“将其设置为null ptr”吗"是否打算包含在函数本身的功能中?@IanLing除非像我的示例中那样传入指针引用,否则这是不可能的。但是,您可以进行我建议的更改,它不会破坏调用它的代码。我的意思是传入引用对调用它的代码是透明的。函数声明是由教授创建的,我们不允许以任何方式更改参数,否则教授的测试用例将失败。是否有任何方法可以在不更改函数声明中的参数的情况下完成相同的操作?@IanLing在函数内部无法执行此操作,您必须在完成后将指针设置为null如果需要,请调用该函数。但是否需要将其设置为null?如果我没有将其设置为null ptr,则在第二次运行destroyStudent()
时会出现“双自由”错误。分配说明destroyStudent()
函数必须“删除“aStudent”指向的学生对象并将其设置为null ptr。”@很遗憾,如果不按照我的回答更改函数签名,就无法在函数内部执行此操作。您确定“将其设置为nullptr”吗是否打算包含在函数本身的功能中?@IanLing除非像我的示例中那样传入指针引用,否则这是不可能的。但是,您可以进行我建议的更改,它不会破坏调用它的代码。我的意思是传入引用对调用它的代码是透明的。