2013-02-17 6 views
3

특정 모듈이 파생 된 추상 module 클래스가 있습니다. 런타임에서, 나는 설정 파일을 구문 분석하고 설정 파일 내에서 각 모듈의 특정 모듈 유형을 확인 :클래스에 전달 된 포인터 벡터 삭제

class partition 
{ 
    public: 
    //Member functions 

    private: 
    //...Other variables 
    std::vector<module*> modules; 
}; 

적절한 방법은 무엇하십시오 partition 클래스에

std::vector<module*> modules; 
module *temp; 

//Let nm be the result of parsing as a std::string 

if(nm == "type1") 
{ 
    temp = new module_1(...); 
} 
else if(nm == "type2") 
{ 
    temp = new module_2(...); 
} 
else if(nm == "type3") 
{ 
    temp = new module_3(...); 
} 
else 
{ 
    //Syntax error 
    return -1; 
} 

modules.push_back(temp); 
partition p; 
p.modules = modules; 

나눠 벡터 modules 일단 내가 끝나면이 모듈 포인터에 대한 메모리 할당을 해제 하시겠습니까? 나는 다음과 같이 partition 클래스의 소멸자에서 삭제하려고했으나 세그먼트 오류와 상처 :

소유권을 처리하는 방법과 파티션 값의 의미를해야 할 것입니다 경우에 따라
partition::~partition() 
{ 
    for(unsigned i=0; i<modules.size(); i++) 
    { 
     delete modules[i]; 
    } 
} 
+2

'std :: vector '대신'std :: vector '을 사용하기로 결정한 이유는 무엇입니까? – LihO

+1

@LihO 그가 가상 기능을 사용한다고 가정합니다. – Lalaland

+0

@Lalaland가 정확합니다. 'module_1'은'module' 등에서 파생됩니다. – Adam27X

답변

2

. 파티션을 복사 할 때 어떤 일이 발생해야하는지 생각하십시오 :

파티션의 복사본이 모듈을 원본과 공유합니까? 모듈의 변경 사항을 파티션간에 공유합니까?

예인 경우 파티션에 std::shared_ptr을 사용해야합니다. 모든 고통은 사라졌습니다.

그렇지 않은 경우 모듈 목록의 전체 복사본을 수행하는 파티션의 복사 생성자 및 할당 연산자를 구현하십시오. 목록의 각 모듈을 삭제하는 소멸자를 구현하십시오. 각 파티션에는 고유 한 모듈 객체가 있으므로 안전합니다.

일반적으로 나는 두 번째 방법을 선호합니다. 전체 복사본을 구현하지 않으려면 partition을 복사 할 수 없게하거나 이동 전용으로 설정하고 std::unique_ptr을 사용하여 삭제를 처리하십시오.

+0

'partition' 클래스의 인스턴스를 다른 클래스'package'에 전달합니다. 'package' 클래스의 인스턴스는 모듈 안에서 작동하는 몇 개의 쓰레드에 전달됩니다. 각 파티션에는 고유 한 모듈 세트가 있으므로 두 번째 방법이 적합합니다. 이 경우에도'package' 클래스를위한 깊은 복사본이 필요합니까? – Adam27X

+0

@ Adam27X 모듈 개체가 스레드로부터 안전합니까? (예 : 하나 이상의 스레드가 동일한 모듈 개체를 사용할 수 있습니까?) – WhozCraig

+0

@WhozCraig 예. 주어진 모듈 자체는 하나 이상의 스레드에 의해 결코 액세스되지 않지만, 현재 코드의 상태에서 각 스레드는 특정 모듈의 서브셋 만 사용하더라도 모든 모듈에 액세스 할 수 있습니다. – Adam27X