C+깊 은 복사 와 얕 은 복사 의 차이 및 응용

얕 은 복사
포인터 에 대한 복사 일 뿐 복사 후 두 포인터 가 같은 메모리 공간 을 가리 키 고 있 습 니 다.
딥 카피
포인터 가 가리 키 는 내용 을 복사(메모리 재배 치)하고 깊이 복사 한 지침 은 서로 다른 주 소 를 가리 키 는 지침 입 니 다.
따라서 얕 은 복사 로 메모 리 를 풀 때 두 개의 지침 을 풀 어서 메모리 에 오류 가 발생 하기 쉽다.
얕 은 복사(방출 시 여러 번 오류 발생)
포인터 만 복사

	//      
	Vector(const Vector<T>& v)
		:_start(nullptr)
		,_finish(nullptr)
		,_endOfStorage(nullptr)
	{
		_start=v._start;
		_finish=v._finish;
		_endOfStorage=v._endOfStorage;
	}
딥 카피
자원 복사

 Vector(const Vector<T>& v)
	
		:_start(nullptr)
		, _finish(nullptr)
		, _endOfStorage(nullptr)
	{
		size_t n = v.capacity();
		_start = new T[n];
		for (size_t i = 0; i < v.size(); ++i)
		{
			_start[i] = v[i];
		}
		_finish = _start + v.size();
		_endOfStorage = _start + n;
	}
Vector 클래스 를 쓰 세 요.

 template<class T>
class Vector
{
typedef T* operator;
typedef const T* const_iterator;
	iterator _start;
	iterator _finish;
	iterator _endOfStorage;
	
 public:
//    
 Vector()
		:_start(nullptr)
		, _finish(nullptr)
		, _endOfStorage(nullptr)
	{}

	//    
	~Vector()
	{
		if(_start)
		{
			delete[] _start;
			_star=_finish=_endOfStorage=nullptr;
		}
	}
T& operator[](size_t pos)
	{
		if (pos >= 0 && pos < size())
			return _start[pos];
	}
size_t size() const
{
	return _finish - _start;
}
 
size_t capacity() const
{
	return _endOfStorage - _start;
}


};
자신의 편집기 로 복사 본 을 넣 어 보 세 요.
첨부:c+깊 은 복사 와 얕 은 복사 문제 인 스 턴 스
얕 은 복사:간단 한 할당 복사 작업;
깊 은 복사:쌓 인 구역 에서 공간 을 다시 신청 하고 복사 작업 을 한다.
문제:얕 은 복사 본 은 쌓 인 메모리 가 중복 방출 되 는 문 제 를 가 져 올 수 있 습 니 다.분석 함수 가 여러 번 호출 되 어 프로그램 이 무 너 집 니 다.
해결:깊 은 복사 로 해결 하고 쌓 인 구역 에서 메모 리 를 다시 신청 하 며 각자 자신의 메모 리 를 방출 하여 중복 방출 을 피한다.

#include <iostream>

using namespace std;

class Person
{
public:
    Person() {
        cout << "Person         "<<endl;
    }
    Person(int age,int height) {
        m_Age = age;
        m_Height = new int(height);//        ,     ,    ,    ;
        cout << "Person       " << endl;
    }
    int m_Age;
    int *m_Height;

    //          ,                    ;
    Person(const Person& p) {
        cout << "Person      " << endl;
        m_Age = p.m_Age;
        //m_Height = p.m_Height;    ,           ;
        m_Height = new int(*p.m_Height);//   
    }

    ~Person() {
        //    ,            
        if (m_Height != NULL) {
            delete m_Height;
            m_Height = NULL;
        }
        cout << "Person       " << endl;
    }
};

void test01(){
    Person p1(18,160);
    cout << "p1    :" << p1.m_Age<<"p1   :"<<*p1.m_Height<< endl;
    Person p2(p1);//             ,       
    cout << "p2    :" << p2.m_Age<< "p2   :"<<*p2.m_Height << endl;
}

int main(){
    test01();
    system("pause");
}
프로그램 실행 결과:

총결산
여기 서 C++딥 복사 와 얕 은 복사 의 차이 점 과 응용 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C+딥 복사 와 얕 은 복사 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기