C++中关于copy构造函数深拷贝的问题:? 400 报错
为什么运行的时候会出错,根据调试结果来看应该是在free的时候出错,就是程序调用析构函数是出错,(而且我发现即便是不为成员变量name分配内存空间的话,程序运行反而正确,这是为什么??)代码如下:
/* *---------------------------- * 析构函数.cpp * Created on: 2015年9月1日 * Author: leiwei *---------------------------- */ #include <iostream> #include<string.h> using namespace std; class Student { private: char* name; int age; float score; public: //构造函数 Student(char *, int, float); //析构函数 ~Student(); //普通成员函数 void say(); //copy构造函数 Student(Student& obj){ age = obj.age; name = (char*)malloc(100); name = obj.name; score = obj.score; } }; //构造函数 Student::Student(char* name1, int age1, float score1) { age = age1; name = (char*)malloc(100); name = name1; score = score1; } Student::~Student() { //析构函数在main函数即将结束的时候才运行 cout << name << "再见" << endl; free(name); } //普通成员函数 void Student::say() { cout << name<<"的年龄是 " << age << ",成绩是 " << score << endl; } int test_Student() { Student stu1("小明", 15, 90.5f); stu1.say(); Student stuObj(stu1); stuObj.say(); cout << "main 函数即将运行结束" << endl; return 0; }
name = obj.name;并不是字符串拷贝!
可以使用C的函数strcpy,或者用c++的std::string作为字符串类型。
######28行给name分配了一块内存 29行又把name指向了obj.name 导致28行分配的内存泄漏了
解决方法一楼正解
######memcpy或者strcpy进行字符串拷贝。你用等号的话28行的变量和obj里面的name指向的是同一块内存,当然会出问题了。######典型的没搞清楚指针,C++建议用 new delete######28行给name分配了一块内存 29行又把name指向了obj.name 导致28行分配的内存泄漏了
解决方法一楼正解
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。