String 클래스의 인용 계수의 얕은 복사
방법 1: String 클래스에서 char*str 및 int*pRefCount;하지만 포인터를 이용해서pRefCount 공간 저장 참조 수를 다시 열면 대량의 메모리 파편이 발생합니다.
코드는 다음과 같습니다.
#include<iostream>
using namespace std;
#include<assert.h>
class String
{
public:
String(char* str="")
:_str(new char[strlen(str)+1])
,_pRefCount(new int[1])
{
strcpy(_str, str);
*_pRefCount = 1;
}
String(const String& s)
:_str(s._str)
,_pRefCount(s._pRefCount)
{
++(*_pRefCount);
}
//
String& operator=(const String& s)
{
if (--(*_pRefCount) == 0)
{
delete[] _str;
delete _pRefCount;
}
_str = s._str;
_pRefCount = s._pRefCount;
++(*_pRefCount);
return *this;
}
~String()
{
if (--(*_pRefCount) == 0)
{
cout << "~String()" << endl;
delete[] _str;
delete _pRefCount;
}
}
int _GetRefCount()
{
return *_pRefCount;
}
void put()
{
cout << _str << endl;
}
private:
char* _str;
int* _pRefCount;
};
void Test()
{
String S;
String s1("Luoluo");
String s2(s1);
S.put();
s2 = s1;
s2.put();
//
assert(s1._GetRefCount() == 2);
assert(s2._GetRefCount() == 2);
String s3("Feifei");
String s4(s3);
s3.put();
s3 = s1;
s3.put();
assert(s1._GetRefCount() == 3);
assert(s2._GetRefCount() == 3);
assert(s3._GetRefCount() == 3);
assert(s4._GetRefCount() == 1);
}
int main()
{
Test();
system("pause");
return 0;
}
방법2: 클래스 중 만 사용str 이전 공간에 인용 계수를 저장하는 변수강제 변환 전후 편이를 이용하여 인용 계수와 문자열을 저장할 위치를 얻습니다.두 개 이상의 같은 문자열에 대해 어떤 문자열을 쉽게 수정하기 위해 다른 문자열은 사실적인 복사를 통해 실현할 수 있다.
코드는 다음과 같습니다.
#include<iostream>
using namespace std;
class String
{
public:
String(char* str = "")
:_str(new char[strlen(str)+5])
{
_str += 4;
_GetRefCount(_str) = 1;
strcpy(_str, str);
}
String(const String& s)
:_str(s._str)
{
++_GetRefCount(_str);
}
String& operator=(const String& s)
{
if (_str != s._str)
{
_Release();
_str = s._str;
++_GetRefCount(_str);
}
return *this;
}
// -----
char& operator[](size_t index)
{
if (_GetRefCount(_str) > 1)
{
char* tmp = new char[strlen(_str) + 5];
tmp += 4;
_GetRefCount(tmp) = 1;
strcpy(tmp, _str);
--_GetRefCount(_str);
_str = tmp;
}
return _str[index];
}
~String()
{
cout << "~String()" << endl;
_Release();
}
int& _GetRefCount(char* str)
{
return(*(int*)(str - 4));
}
void _Release()
{
if (--(_GetRefCount(_str)) == 0)
{
delete[](_str - 4);// ,
}
}
void put()
{
cout << _GetRefCount(_str)<<"---------"<<_str << endl;
}
private:
char* _str;
};
void Test()
{
String S;
String s1 = "abclefg";
String s2(s1);
S.put();
s1.put();
s2.put();
s2 = s1;
s2.put();
String s3 = "hijklmn";
String s4(s3);
s3.put();
s3 = s1;
s3.put();
s1[3] = 'd';
s1.put();
s2.put();
}
int main()
{
Test();
system("pause");
return 0;
}
이 문서는 "Scen"블로그에서 작성되었으므로 출처는 반드시 보존하십시오.http://10741357.blog.51cto.com/10731357/1747871
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.