Tim的博客

Tim的学习手册

STL容器共性机制

STL 容器所提供的都是值(value)寓意,而非引用(reference)寓意,也就是说当我们给容器中插入元素的时候,容器内部实施了拷贝动作,将我们要插入的元素再另行拷贝一份放入到容器中,而不是将原数据元素直接放进容器中,也就是说我们提供的元素必须能够被拷贝。
1、除了 queue 和 stack 之外,每个容器都提供可返回迭代器的函数,运用返回的迭代器就可以访问元素。
2、通常 STL 不会抛出异常,需要使用者传入正确参数。
3、每个容器都提供了一个默认的构造函数和默认的拷贝构造函数。

4、大小相关的构造方法: ① size()返回容器中元素的个数 ② empty()判断容器是否为空

先看下面一段代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
using namespace std;
class Person{
public:
	Person(char* name,int age){
		this->pName = new char[strlen(name) + 1];
		strcpy(this->pName,name);
		this->mAge = age;
	}
	~Person(){
		if (this->pName != NULL){
			delete[]this->pName;
		}
	}
public:
	char* pName;//容易出现浅拷贝的问题
	int mAge;
};
void test01(){
	Person p1("AAA",22);
	vector<Person> v1;
	v1.push_back(p1);
}
int main(void)
{
	test01();
	system("pause");
	return 0;
}

对象中的成员包含了指针,这样就容易引发浅拷贝的问题,因为向容器内部存放元素的时候,容器只是做了简单的值拷贝,并没有做深拷贝动作,导致对象指向的内存和容器中浅拷贝的对象所指向的内存被释放两次,导致了错误:



原因在于两个指针指向了同一块堆区内存,这样会导致不可预知的结果,函数结束其中一个调用析构函数,销毁了data指向的内存空间,而另一个对象析构的时候就会挂掉。
问题的解决办法就是,给我们的对象提供一个拷贝构造函数,并且重载=操作符,两个指针分别指向自己的那一块内存,互不影响。避免这种问题的最好方式就是自己给出拷贝构造函数并且重写等号操作符:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
using namespace std;
class Person{
public:
	Person(char* name,int age){
		this->pName = new char[strlen(name) + 1];
		strcpy(this->pName,name);
		this->mAge = age;
	}
	//拷贝构造函数
	Person(const Person& other){
		this->pName = new char[strlen(other.pName) + 1];
		strcpy(this->pName, other.pName);
		this->mAge = other.mAge;
	}
	//重载等号操作符
	Person& operator=(const Person& other){

		if (this->pName != NULL){
			delete[]this->pName;
		}
		 
		this->pName = new char[strlen(other.pName) + 1];
		strcpy(this->pName, other.pName);
		this->mAge = other.mAge;
		return *this;
	}
	~Person(){
		if (this->pName != NULL){
			delete[]this->pName;
		}
	}
public:
	char* pName;//容易出现浅拷贝的问题
	int mAge;
};
void test01(){
	Person p1("AAA",22);
	vector<Person> v1;
	v1.push_back(p1);
}
int main(void)
{
	test01();
	system("pause");
	return 0;
}


这样的话就算发生了拷贝动作,容器执行的也是深拷贝,不会发生对同一块内存连续释放两次的情况!

阅读更多
版权声明:转载请标明原地址! https://blog.csdn.net/m0_38032942/article/details/79964864
上一篇Java8的接口与抽象类
下一篇STL容器使用时机总结
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭