调用析构函数时无法delete 内存

图片说明
class Student {

    friend ostream& operator<<(ostream &out, const Student &object);

public:
Student() {
age = 0;
name[0] = '\0';
}

    void print() {
        cout << name << ", " << age << endl;
}

Student(int _age, const char *_name) {
    age = _age;
    name = new char[strlen(_name)];
    strcpy_s(name, strlen(_name) + 1, _name);

}

~Student() {
    if (name!=NULL)
    {
        cout << "stubent析构函数" << endl;
        delete[] name;
        name = NULL;
    }
}

private:
int age;
char *name = NULL;
};

ostream& operator<<(ostream &out, const Student &object) {
out << "(" << object.name << " , " << object.age << ")";
return out;
}

int main(void) {

Student s1(18, "ckh");
cout << s1 << endl;

system("pause");
return 0;

}

name = new char[strlen(_name) + 1];
要多申请一个字节给'\0'。
因为拷贝的字节数量是 strlen(_name) + 1,在申请的strlen(_name)空间中容不下,也就破坏了申请空间的边界,释放时就会奔溃。
构造函数Student()也有这个问题,name[0] = '\0';不能没申请内存就使用内存。

看你怎么调用的,你没有实现拷贝构造函数,如果多个对象指向相同的name,那么就会造成重复释放的问题。