您的位置:首页 > 编程语言 > C语言/C++

C++ STL 如何安全的将一个含有指针变量的类对象放在容器中? 避免浅拷贝问题

2018-03-25 15:54 375 查看
深拷贝浅拷贝问题



单纯的使用系统自带的拷贝构造函数会造成两个对象所指内存空间为同一块,在析构的时候一块内存空间就会被析构两次,然后就出现程序的相应中断
解决办法:1 重写拷贝构造函数2 重载 = 号操作符#include<iostream>

using namespace std;

#include"vector"

class Student{

public:
Student(char *
4000
m_name, int m_age) //有参数的构造函数
{
name = new char[strlen(m_name) + 1]; //先分配内存
strcpy(name, m_name); //赋值

age = m_age;
}

Student(const Student &obj) //拷贝构造函数
{
name = new char[strlen(obj.name) + 1];
strcpy(name, obj.name); //赋值
age = obj.age;
}

//实现 t3 = t2 = t1 this指向t2
Student& operator = (const Student &obj) //重载等号(=)操作符 并且返回一个类的引用
{
//先释放t2原本的内存空间

if (this->name != NULL)
{
delete[] name;
name = NULL;
age = 0;
}

//根据t1 开辟新的内存空间
name = new char[strlen(obj.name) + 1];

//copy值
strcpy(name, obj.name); //赋值
age = obj.age;

//返回一个引用

return *this;

}

~Student() //析构函数
{
if (name!= NULL) //如果年龄不为空指针就释放该内存空间
{
delete [] name;
name = NULL;
age = 0;
}
}
public:
char * name;
int age;
};

void exp()
{
Student s1("李二蛋",22);
vector<Student> v1;
v1.push_back(s1);
cout << v1.back().name << endl;

}

int main()
{
exp();
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐