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;
}
单纯的使用系统自带的拷贝构造函数会造成两个对象所指内存空间为同一块,在析构的时候一块内存空间就会被析构两次,然后就出现程序的相应中断
解决办法: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;
}
相关文章推荐
- c++中构造函数调用另一构造函数的问题,如何避免生成临时对象
- [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)
- C++模板类 容器之map及对象副本 深/浅拷贝等问题浅析
- 对象容器Effective STL——容器中所发生的对象拷贝问题
- C++之模板类(Template) 容器之map 及 对象副本 深/浅拷贝 等问题
- C++模板类 容器之map 及 对象副本 深/浅拷贝 等问题
- C++之模板类(Template) 容器之map 及 对象副本 深/浅拷贝 等问题
- 如何判断一个C++对象是否在堆上
- c++是如何处理 对象 作为返回值 和 输入参数的 -- 拷贝构造
- 如何判断一个C++对象是否在堆栈上
- C++递归问题之二——n皇后问题:以四、八皇后为例,给定n个皇后要求将它们放在一个n维矩阵中,任意两个皇后不能出现在同一行、列、主副对角线上,输出具体的摆放方式
- 一个类中静态容器对象的初始化问题
- 如何用VS2010新建一个类?用来写C++文件的标准格式建立?就是能做到声把声明放在.H里,实现放在.CPP里的
- C++模板类 容器之map 及 对象副本 深/浅拷贝 等问题
- C++中防止STL中迭代器失效__map/set等关联容器vector/list/deque等序列容器_如何防止迭代器失效_即erase()的使用
- 一个有关C++中对象构造、析构和虚函数的问题
- C++中遍历容器对象时需要注意的问题
- [C++]运行时,如何确保一个对象是只读的
- GDB pretty printer: linux下用gdb调试c++时如何更好的查看STL容器值
- 一个类中静态容器对象的初始化问题