침입 지능 지침
7430 단어 포인터
자원 공유형의 스마트 지침은 두 가지 실현이 있는데 하나는 침입식이고 하나는 시비침입식이다.교재에서 흔히 볼 수 있는 비침입식의 실현은 스마트 포인터 템플릿에 있다. 템플릿 클래스는 자원 클래스의 대상을 저장하는 포인터 변수와 자원 대상의 계수를 기록하는 포인터 변수가 있는데 이 두 가지는 모든 스마트 포인터 대상이 공유하기 때문에 포인터를 통해 저장한다.침입식은 다르다. 그의 실현은 스마트 포인터 템플릿과 스마트 포인터 템플릿을 사용하는 클래스에 분산된다. 템플릿 클래스는 대상을 저장하는 포인터 변수만 있고 대상의 계수는 자원 클래스에 있다.
비침입식 스마트 포인터, 인용 계수 변수는 모든 대상의 공유를 확보하기 위해 무더기의 메모리를 사용해야 하기 때문에 new를 사용해야 한다. 이것은 모두 똑같다. 다른 것은 new를 사용하는 횟수다.침입식 스마트 포인터의 인용 계수 변수는 대상에 저장된다. 대상이 유일하기 때문에 인용 계수도 유일하다. 비침입식 스마트 포인터에 비해 장점은 다음과 같다. 1. 자원 대상은 몇 개의 침입식 스마트 포인터에 포함되든 처음부터 끝까지 하나의 인용 계수 변수만 있고 스마트 포인터 대상을 사용하는 곳마다 new의 계수 대상이 필요하지 않기 때문에 효율이 비교적 높다.사용 메모리도 비교적 적고 안전하다.2. 인용 계수는 대상 자체에 저장되기 때문에 함수를 호출할 때 자원 대상의 주소를 직접 전달할 수 있고 인용 계수 값이 분실될 염려가 없다(침입식 스마트 바늘 대상의 복사가 아니라 스마트 바늘 템플릿을 가지고 있어야 한다. 그렇지 않으면 대상 인용 계수가 분실될 수 있다).나쁜 점: 1. 자원 클래스는 반드시 인용 계수 변수가 있어야 하고 이 변수의 증가와 감소는 침입식 스마트 지침 템플릿 기류에 의해 조작될 수 있기 때문에 번거롭다.2. 이 종류가 스마트 포인터를 사용하지 않으려면 인용 계수 변수를 가지고 있다.
또 스마트 포인터는 피할 수 없는 문제가 하나 있는데 바로 순환 인용이다.
가장 간단한 예:
class A
{
public:
void attach(ptr< A > obj)
{
m_obj = obj;
}
private:
ptr< A > m_obj;
}
void self_cir_ref()
{
ptr< A > pA( new A ); /// 1
pA->attach( pA ); ///attach , 2
} /// self_cir_ref(), 1, 1, 。
그리고 예를 들어 B류에는 A류 대상이 있고 A류에는 B류 대상이 있기 때문에 약한 인용이 생겼다. 위의 예와 약한 인용은 모두 침입식 스마트 지침과 무관하기 때문에 여기서 주제에 치우치지 않는다.
침입 지능형 포인터의 불완전한 예:
#include <iostream>
/**
,
cswuyg
*/
template< class T >
class refObjectPtr
{
public:
refObjectPtr(T* ptr)
{
m_pServer = ptr;
if (m_pServer != 0)
{
m_pServer->addRef();
}
}
~refObjectPtr()
{
if (m_pServer != 0)
{
m_pServer->release();
m_pServer = 0;
}
}
T* operator->() const {
return m_pServer;
}
private:
T* m_pServer;
};
class CTest
{
public:
CTest(int value) : m_nValue(value)
{
m_pCount = new int(0);
std::cout << __FUNCTION__ << std::endl;
}
~CTest()
{
std::cout << __FUNCTION__ << std::endl;
}
void addRef()
{
(*m_pCount)++;
}
void release()
{
(*m_pCount)--;
if (*m_pCount == 0)
{
delete this;
}
}
int getCount()
{
return *m_pCount;
}
private:
int* m_pCount;
int m_nValue;
};
void test2(CTest* ptr)
{
refObjectPtr<CTest> temp = ptr;
// 2, , ,
std::cout << temp->getCount() << std::endl;
}
void test1()
{
CTest* p = new CTest(10);
refObjectPtr<CTest> ptr = p;
test2(p);
}
int main(int argc, char* argv[])
{
test1();
system("pause");
return 0;
}
침입식 스마트 지침은 응용할 가치가 있어 위험을 피하고chromium에서 대량으로 사용되었다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
c 언어로 2차원 문자열 배열을 함수에서 반환하는 방법c 언어를 사용하고 2차원 문자열 배열을 함수에서 main 함수로 반환하는 방법에 대한 메모를 남겨 둡니다. ※포인터 초보자이므로, 설명이 잘못되어 있으면 지적 부탁합니다. paiza.io에서 실행해 보면 아래와 같...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.