침입 지능 지침

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에서 대량으로 사용되었다.

좋은 웹페이지 즐겨찾기