C + + 의 비트 복사 와 값 복사
설명 하기 편리 하도록 우 리 는 String 류 를 예 로 들 면:
구성원 함수 가 아 닌 String 클래스 를 먼저 정의 합 니 다.
1 Class String{
2 public:
3 String(const char *ch=NULL);//
4 String(const String &str);//
5 ~String(void);
6 String &operator=(const String &str);//
7 private:
8 char *m_data;
9 };
비트 복사 본 은 주소 이 고 값 복사 본 은 내용 입 니 다.두 개의 String 대상 A 와 B 를 정의 하면A.m_data 와 B. mdata 는 각각 한 구역 을 가리 키 며, A. mdata="windows",B.m_data=“linux";
할당 함 수 를 다시 쓰 지 않 으 면 B 를 A 에 부여 합 니 다. 컴 파일 러 는 기본적으로 비트 복사, A. m data = B. m data 를 합 니 다.
A. m data 와 B. m data 가 같은 영역 을 가리 키 고 있 습 니 다. A. m data 가 가리 키 는 내용 은 'Liux' 로 바 뀌 지만 이런 문제 가 발생 하기 쉽 습 니 다.
(1): A. m data 가 가리 키 는 메모리 영역 이 방출 되 지 않 아 메모리 가 유출 되 었 습 니 다.
(2): A. m data 와 B. m data 가 같은 구역 을 가리 키 면 어느 한 쪽 의 변화 도 다른 쪽 에 영향 을 줄 수 있다.
(3): 대상 이 분석 되 었 을 때 B. m data 는 두 번 방출 된다.
컴 파일 러 에 대해 서 는 복사 함수 와 할당 함 수 를 주동 적 으로 작성 하지 않 으 면 '비트 복사' 방식 으로 부족 한 함 수 를 자동 으로 생 성 합 니 다.
할당 함수 와 복사 구조 함 수 를 다시 쓰 면,
A. m data = B. m data 는 값 을 복사 하여 B. m data 의 내용 을 A. m data 에 부여 합 니 다. A. m data 는 원래 의 메모리 영역 을 가리 키 지만 그 내용 은 변 경 됩 니 다.
돌리다http://www.chinaitlab.com/c/ccjq/913552.html
비트 복사 본 은 주소 (얕 은 복사 라 고도 함) 이 고 값 복사 본 은 내용 (깊 은 복사) 입 니 다. 깊 은 복사 와 얕 은 복사 본 은 자원 이 있 으 면 이런 대상 이 복사 과정 이 발생 할 때 자원 을 재배 치 하 는 것 으로 간단하게 이해 할 수 있 습 니 다. 이 과정 은 깊 은 복사 입 니 다. 반대로 자원 을 재배 치 하지 않 으 면 얕 은 복사 입 니 다.
비트 복사 및 "bitwise assignment" 이란 한 대상 의 메모리 이미 지 를 다른 대상 에 게 그대로 복사 하 는 것 을 말 하 며, 값 복사 란 원래 대상 의 값 을 새 대상 에 게 복사 하 는 것 을 말 합 니 다. "bitwise assignment" 을 사용 하고 있 습 니 다."대상 의 메모리 이미 지 를 다른 대상 에 게 직접 복사 합 니 다. 그러면 두 대상 은 같은 메모리 영역 을 가리 키 며 한 대상 이 풀 려 나 면 다른 대상 의 지침 이 빈 지침 이 됩 니 다. 이때 operator = copy constructor 를 작성 하여 값 복사 가 이 루어 져 야 합 니 다."
기본 적 인 복사 구조 함수 '와' 결 성 된 할당 함수 '는 모두' 비트 복사 '가 아 닌' 값 복사 '방식 으로 이 루어 집 니 다. 만약 에 클래스 에 포인터 변 수 를 포함 하면 이 두 함수 가 실 수 를 할 수 밖 에 없습니다.
초기 화 된 사용자 정의 클래스 대상 으로 다른 구조의 대상 을 초기 화 할 때 복사 구조 함수 가 자동 으로 호출 됩 니 다. 즉, 같은 대상 이 복사 가 필요 할 때 복사 구조 함수 가 호출 됩 니 다. 다음 과 같은 경우 복사 구조 함수 가 호출 됩 니 다.
1. 한 대상 이 값 으로 전달 하 는 방식 으로 함수 체 에 전달 된다.
2. 한 대상 이 값 으로 전달 하 는 방식 으로 함수 에서 되 돌아 갑 니 다.
3. 한 대상 은 다른 대상 을 통 해 초기 화 해 야 합 니 다.
클래스 에서 복사 구조 함 수 를 명시 적 으로 설명 하지 않 으 면 컴 파일 러 는 기본 복사 구조 함 수 를 자동 으로 생 성 합 니 다. 이 구조 함 수 는 대상 간 의 위치 복사 가 완 료 됩 니 다. 비트 복사 는 얕 은 복사 라 고도 합 니 다. 사용자 정의 복사 구조 함 수 는 좋 은 프로 그래 밍 스타일 로 컴 파일 러 가 기본 복사 구조 함 수 를 형성 하 는 것 을 막 고 소스 코드 를 향상 시 킬 수 있 습 니 다.능률
사용자 정의 복사 구조 함수 가 없 으 면 시스템 은 기본 복사 구조 함 수 를 만 들 지만 시스템 이 만 든 기본 복사 구조 함 수 는 '비트 복사' 만 실 행 됩 니 다."복사 대상 의 데이터 구성원 의 값 을 새로 만 든 대상 에 게 일일이 할당 합 니 다. 이러한 데이터 구성원 중 지침 구성원 이 있 으 면 새로운 대상 의 지침 이 가리 키 는 주 소 는 복사 대상 의 지침 이 가리 키 는 주소 와 같 습 니 다. delete 이 지침 은 두 번 반복 delete 로 인해 오류 가 발생 할 수 있 습 니 다. 다음은 이 전형 적 인 예 를 들 어 보 겠 습 니 다."
1 Class String{
2 public:
3 String(const char *ch=NULL);//
4 String(const String &str);//
5 ~String(void);
6 String &operator=(const String &str);//
7 private:
8 char *m_data;
9 };
String 을 예 로 들 면 strA 와 strB 를 정의 합 니 다.
1 int main(){
2 String strA("hello");
3 String strB("world");
4 strB = strA;
5 // strA strB
6 //
7 // delete
8 return 0;
9 }
복사 구조 함수 와 할당 함 수 를 주동 적 으로 작성 하지 않 으 면 컴 파 일 러 는 "비트 복사" 방식 으로 결 성 된 함 수 를 자동 으로 생 성 합 니 다. 클래스 에 포인터 변수 가 포함 되 어 있다 면 이 두 결 성 된 함 수 는 오 류 를 포함 합 니 다. 클래스 String 의 두 대상 인 strA, strB 를 예 로 들 어 strA. m data 의 내용 을 "hello" 라 고 가정 하면 strB. m data 의 내용 은 "World" 입 니 다.. 현재 strA 를 strB 에 부여 합 니 다. 할당 함수 가 부족 한 '비트 복사' 는 strB. m data = strA. m data 를 실행 하 는 것 을 의미 합 니 다. 이 는 세 가지 오 류 를 가 져 올 수 있 습 니 다.
● strB. m data 기 존의 메모리 가 방출 되 지 않 아 메모리 가 유출 되 었 습 니 다.
● strB. m data 와 strA. m data 는 같은 메모 리 를 가리 키 며, strA 또는 strB 의 어느 한 측의 변동 도 다른 한 측 에 영향 을 줄 수 있다.
● 대상 이 분석 되 었 을 때 m data 는 두 번 방출 되 었 다.
컴 파일 러 에 대해 서 는 복사 함수 와 할당 함 수 를 주동 적 으로 작성 하지 않 으 면 비트 복사 방식 으로 부족 한 함 수 를 자동 으로 생 성 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.