C/C++의 쓰기 시 복사
무엇 을 쓸 때 복사 합 니까?앞에서 내 가 깊 은 복사,얕 은 복사 라 고 했 잖 아.오늘 우리 가 쓸 때 복사 하 는 것 을 탐구 해 보 자.깊 은 복사 본 은 얕 은 복사 의 부족 을 보충 한 것 으로 복사 할 때 복사 하 는 것 은 사실은 깊 은 복사 의 부족 을 보충 하 는 것 이다.사실 쓸 때 복사 한 다 는 뜻 은 이 공간 을 읽 을 때 똑 같은 공간 을 만들어 주지 않 는 다 는 것 이다.네가 진정 으로 복사 가 필요 할 때 그 는 너 에 게 공간 을 열 어 줄 것 이다.지연 판 의 딥 카피 다.
쓰기 시 복사 기술 은'인용 계수'를 통 해 이 루어 집 니 다.공간 을 분배 할 때 4 개의 바이트 를 더 분배 하여 몇 개의 포인터 가 블록 공간 을 가리 키 는 지 기록 합 니 다.새로운 포인터 가 이 공간 을 가리 킬 때 인용 계수 에 하 나 를 더 하고 이 공간 을 방출 하려 면 인용 계수 에서 하 나 를 줄 이 고 인용 계수 가 0 으로 줄 어 들 때 까지 이 공간 을 정말 방출 합 니 다.어떤 지침 이 이 공간의 값 을 바 꾸 려 고 할 때 이 지침 에 자신의 공간 을 분배 합 니 다.
쓸 때 복사 하 는 실 용적:string 클래스 구현
class String
{
public:
String(const char *str = "")
:_str(new char[strlen(str) + 1 + 4])
{
cout << "Sring()" << endl;
_str += 4; // 4
GetCount() = 1; // 1
strcpy(_str, str);
}
String(String& s)
:_str(s._str)
{
cout << "Sring(String&)" << endl;
GetCount()++;
}
String& operator=(String& s)
{
cout << "Sring& operator=" << endl;
if (this != &s)
{
Release();
_str = s._str;
GetCount()++;
}
return *this;
}
~String()
{
cout << "~Sring()" << endl;
Release();
}
public:
char& operator[](size_t index)
{
if (GetCount() == 1) // 1,
{
return _str[index];
}
GetCount()--;
char *tmp = _str;
_str = new char[strlen(tmp) + 1 + 4];
_str += 4;
strcpy(_str, tmp);
GetCount() = 1;
return _str[index];
}
private:
int& GetCount()
{
return *(int *)(_str - 4);
}
void Release()
{
if (--GetCount() == 0)
{
cout << " " << endl;
delete[](_str - 4); // 4
_str = NULL;
}
}
private:
char *_str;
};
여기에 문제 가 하나 있 습 니 다.C++표준 은 확실히 이 렇 습 니 다.C+표준 은 교체 기 나[]를 통 해 string 의 내부 주 소 를 얻 었 을 때 string 은 읽 을 지 쓸 지 모 릅 니 다.이것 은 확실 하지 않 습 니 다.이 를 위해 내부 인용 을 얻 은 후에 쓰기 동작 을 포착 하지 못 하 는 것 을 피하 기 위해 쓰기 가 폐지 되 었 을 때 복사 기술 을 사용 합 니 다.이렇게 보면 우 리 는 쓰기 시 복사 할 때 반드시 주의해 야 한다.만약 에 string 의 내 부 를 수정 할 필요 가 없다 면[]연산 자 와 교체 기 를 통 해 문자열 의 내부 주소 인용 을 얻 지 마라.만약 에 네가 반드시 이렇게 해 야 한다 면 대 가 를 치 러 야 한다.물론 string 은 교체 기와 인용 을 무효 화 하 는 방법 도 제공 했다.예 를 들 면 pushback,[]을 사용 한 후에 교체 기 를 사용 하면 인용 이 효력 을 잃 을 수 있 습 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
hdu 1717 소수 화 점수 2 (수학)소수 화 점수 2 레이 는 수학 시간 에 선생님 의 말씀 을 듣 고 모든 소수 가 점수 로 표시 되 는 형식 이 라 고 말 했다. 그 는 녹 기 시 작 했 고 곧 완성 되 었 다. 그러나 그 는 또 하나의 문 제 를...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.