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+딥 복사 와 얕 은 복사 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
HDU 원활 공사 & & 원활 공사 (차 트 법)모 성 은 도시 의 교통 상황 을 조사 하여 기 존의 도시 도로 통계 표를 얻 었 고 표 에는 모든 도로 가 직접 연 결 된 도시 가 열거 되 어 있다.성 정부의 '원활 한 공사' 목 표 는 성 전체의 어느 두 도시...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.