2012-05-30 4 views
0

이것은 내 프로그램의 샘플 코드입니다. 여기에 나는 동적으로 메모리를 할당하는 std :: auto_ptr을 사용하고 같은 변수에 대한 할당 메모리를 다시 할당 한 후에 함수에 값을 입력한다. 그래서 이전에 할당 된 메모리는 같은 메모리에 새로운 메모리가 할당 될 때 할당 해제됩니다. 나는 std :: auto_ptr을 사용하고 있기 때문에 이에 대해 의심 스럽다. 미리 감사드립니다.auto_ptr에 대한 동적 메모리 할당

std::auto_ptr<HANDLE> *eventHandle; 

여기

#include "stdafx.h" 
    #include <iostream> 
    #include <memory> 
    #include <windows.h> 

    std::auto_ptr<HANDLE> *eventHandle; 

    void function() 
    { 
    eventHandle = new std::auto_ptr<HANDLE>[5]; 
    std::auto_ptr<HANDLE> handle(new HANDLE); 
    *handle = CreateEvent(NULL, false, false, NULL); 
    eventHandle[0] = handle; 
    } 

    void f2() 
    { 
    if(NULL == eventHandle) 
    { 
     std::cout<<" HANDLE NULL"; 
    } 
    } 

    int _tmain(int argc, _TCHAR* argv[]) 
    { 
    function(); 
    f2(); 
    function(); 
    return 0; 
    } 
+1

'new std :: auto_ptr'을 쓰면 auto_ptr의 목적을 무효화합니다. – Pubby

+0

@Pubby : 이것은 동적 크기의'auto_ptr' 배열입니다. 또는 '5'가 하드 코딩 된 상수가 아닌 경우입니다. 동적 크기의 배열은 같은 방식으로'auto_ptr'의 목적을 무효화하지 않습니다. –

답변

1

당신은 원시 포인터를, 그래서 당신이 그것을 다시 할당 할 때 이전 값은 덮어 쓰기 및 유형 auto_ptr의 객체의 배열이 이전에 유출하는 지적했다.

2

예제에서 : HANDLE 포인터는 스마트 포인터이지만 std::auto_ptr 배열은 아닙니다. 이 경우 두 번째 function() 호출 전에 delete [] eventHandle 번으로 전화해야합니다. 그러면 HANDLE 스마트 포인터도 삭제됩니다.

그러나 HANDLE 개체는 삭제하기 전에 CloseHandle 함수에 의해 닫혀 야하므로 스마트 포인터가 필요한지는 질문합니다. 여기서는 HANDLE이 더 이상 필요하지 않으며 개체에 대한 포인터가있을 때 항상 알 수 있습니다. 삭제됩니다.

P. std::auto_ptr은 약간 결함이 있습니다. VS2010에 액세스 할 수 있다면 std::shared_ptr을 사용하시기 바랍니다.

P.P.S. NULL을 테스트하려면 NULL에 대한 포인터를 항상 초기화해야합니다. 기본값은 아닙니다. std::auto_ptr<HANDLE> *eventHandle = NULL;

+0

std :: shared_ptr의 비트가 auto_ptr보다 비쌉니다. 그것은 std :: unique_ptr이며 auto_ptr에 대한 C++ 11 직접 대체입니다. –

+0

가장 중요한 점은'shared_ptr' 또는'unique_ptr'을 사용하면 불쾌한'new []'를 없애고 스마트 포인터의 멋진'std :: vector' 또는'std :: array'를 사용할 수 있습니다. –

+0

@SteveJessop 절대적으로 표준 컨테이너와 호환되지 않는 많은 auto_ptr 결함 중 하나였습니다. – Plexico