2015-01-13 4 views
-1

저는 C++에 비교적 익숙합니다. 내가 버퍼 할당 해요 :데이터 삭제없이 "삭제"포인터

: 제 3 자 라이브러리를 사용하여

uint8 *buffer = new uint8[len]; 

을, 나는 원시 이미지 데이터로 버퍼를 "인수"하기 위해 "IMG"개체 (이 사진의)의 방법을 사용

img->SetBuffer((uint8*)data); 

"take over"는 실제로 "img"객체가 "SetBuffer"가 "buffer"의 데이터를 가리키는 자체 포인터를 가지고 있음을 의미합니다. 그것은 모두 잘 작동하지만, 컴파일러는 메모리 누수에 대해 (경고가 아니라 오류)라고 불평합니다. 이 줄을 추가하면 SetBuffer 뒤에 "버퍼 삭제;"경고가 사라지지만 동시에 "img"는 공백 (데이터 없음)으로 끝납니다. 컴파일러 경고를 피하고 데이터를 유지하려면 어떻게해야합니까? 가리키는 데이터를 손상시키지 않고 "버퍼"포인터 자체 만 삭제할 수 있습니까? 나중에 코드에서 "img"개체를 삭제합니다.이 개체는 어쨌든 모든 이미지 데이터를 지 웁니다.

+0

어떤 경우'[] buffer' 삭제해야합니다. – fredoverflow

+0

아마도 이미지의 메모리를 삭제하지 않았을 것입니다. 그들은 둘 다 같은 장소를 가리키고 있다고 가정하기 때문에 하나만 삭제해야합니다. 포인터 중 하나를 통해 할당 된 mempry를 삭제했는지 확인하십시오. 해당 메모리 블록에서의 사용이 끝나면. 그건 그렇고, "delete [] x". –

+0

컴파일러의 정확한 메시지는 무엇입니까? – molbdnilo

답변

0

img은 t의 버퍼를 할당 해제 "아무튼, 당신은 당신이 img을 해제 한 번에 있습니다.

delete img; 
delete [] buffer; 
+0

고마워요, 짧고 달콤한 – MrSparkly

2

당신은 클래스의 문서 (또는 소스) (*img의 종류)을 읽어야합니다.

  1. 귀하의 가정이 올바른지 확인하십시오 SetBuffer
  2. 클래스가 파괴시 버퍼를 할당 해제하는지 확인하십시오.

클래스가 버퍼 자체를 파괴하지 않으면 img이 가리키는 객체를 파괴 한 후에해야합니다.

-edit-

는 MSalters 제대로 메모리가 클래스 자체에 의해 해제 될 경우는 물론, 즉 free()으로, allocator::deallocate()malloc()delete[]new[], allocator::allocate()를 사용 (적절한 할당 방식을 사용해야합니다 언급 한 바와 같이 ...)

[렘 :. 귀하의 질문은 클래스가 어떤 해제 당신이 그것을 사용하는 방법을하지 않음을 나타냅니다]

+1

클래스가 메모리를 할당 해제하는 경우 해당 할당 메커니즘을 사용해야합니다. 예를 들어 클래스가 (어리석게)'free() '를 호출하면 함께 재생해야합니다. 'malloc()'을 사용하십시오. – MSalters

+0

정확합니다. 이해를 돕기 위해 추가 할 것입니다. – Pixelchemist