2012-11-03 2 views
1

그리고 성능면에서 이점이 있습니까? 예이 간단한 예가 RAII로 간주됩니까

는 클래스/구조체라는 arraydata을 만들고 게다가 일부 정렬 메모리를 할당 (.dataPtr 의해 제공된 포인터 비록)

 arraydata X(30,20); 
+0

왜 당신을 free/malloc을 C++로 사용 하시겠습니까? – Cubic

+0

@Cubic : 이것은 불행히도 정렬 된 스토리지를 얻는 유일한 방법입니다. 이것을 포장하는 다른 방법이 있습니다. –

답변

6
:

class arraydata//to allocate some memory, 
       //and return a pointer to that block of memory 
{ 
    void *dataPtrV; 

    public: 

    double *dataPtr; 

    arraydata(int a, int b) 
    { 
     dataPtrV=_aligned_malloc(a*b*sizeof(double),32); 
     dataPtr=(double *)dataPtrV; 
    } 

    ~arraydata() 
    { 
     _aligned_free(dataPtrV); 
     dataPtrV=NULL; 
     dataPtr=NULL; 
    } 
}; 

그때 호출

예, RAII로 간주됩니다. 자원은 생성자에서 획득되고 소멸자에서 해제됩니다.

왜 과 double*을 모두 저장하는지 잘 모르겠지만 - double* 만 있으면 충분합니다.

또한 클래스를 복사 할 때 누출로 쉽게 이어지고 이미 해제 된 데이터가 해제되므로주의해야합니다. void*없이

struct aligned_free { 
    void operator()(void* p) { 
    _aligned_free(p); 
    } 
}; 

template<typename T> 
T* aligned_malloc(std::size_t size, std::size_t alignment) { 
    return static_cast<T*>(_aligned_malloc(size * sizeof(T), alignment)); 
} 

std::unique_ptr<double, aligned_free> make_array_data(int a, int b) { 
    return std::unique_ptr<double, aligned_free>(aligned_malloc<double>(a*b, 32)); 
} 

auto arraydata = make_array_data(30, 20); 

여기 클래스입니다 :

어쨌든,이 또한 더 관용적이다 std::unique_ptr 및 클래스의 낙하하지 않고를 사용하여 수행 할 수 있습니다

class arraydata//to allocate some memory, 
       //and return a pointer to that block of memory 
{ 

    public: 

    double *dataPtr; 

    arraydata(int a, int b) 
    { 
     dataPtr=static_cast<double*>(_aligned_malloc(a*b*sizeof(double),32)); 
    } 

    ~arraydata() 
    { 
     _aligned_free(dataPtr); 
    } 
}; 
+0

고마워, 무효 포인터에 관해서는, 글쎄, _aligned_malloc() 함수는 void 포인터 만 받아들이 기 때문이다. – user0002128

+0

@ user1748356'double *'없이 코드를 게시했습니다. 그것이 컴파일되지 않으면 말해봐. – Pubby

+0

두 번 캐스팅하면 _aligned_free가 제대로 작동 할 수 있습니까? btw, _aligned_free는 void 포인터로만 해제 할 수 있으므로 dataPtr을 다시 캐스팅해야하거나 적어도 그렇게 생각합니다. – user0002128