2013-07-30 2 views
3

정말 도움이되는 사람들에게 정말 감사드립니다. 감사합니다!메모리 누수를 방지하기 위해 어떻게 삭제할 수 있습니까?

struct MyImage 
{ 
    BYTE* pImage; 
    int width; 
    int heigth; 
}; 
MyImage* pMyImage = new MyImage; 
pMyImage->pImage = new BYTE[width * heigth]; 

내가 이렇게해야합니까?

delete [] pMyImage->pImage; 

또는 이렇게해야합니까?

delete[] pMyImage->pImage; 
delete pMyImage; 

귀하의 아이디어와 감사의 말씀에 감사드립니다.

MyImage* transform(Bitmap &gdiImage) 
{ 
MyImage* image=new MyImage;//新建一个MyImage 

int height=gdiImage.GetHeight(); 
int width=gdiImage.GetWidth(); 

image->pImage=new BYTE[height*width];//为存储灰度图像数据分配内存 

image->height=height; 
image->width=width; 

Color temp; 
for(int y = 0;y < height; ++y) 
    for(int x = 0;x < width; ++x) 
    { 
     //获取当前GDI+图像坐标所指向的像素的颜色 
     gdiImage.GetPixel(x, y, &temp); 
     //将这个像素的灰度值赋给灰度图像对应的内存中的相应的字节 
     *(image->pImage + y * width + x) = transformPixel(temp.GetValue()); 
    } 
return image; 
} 

내 코드는이 함수는 구조체 myimage을에 gdiImage 번역, 다음과 같습니다. 은 다음과 같이, 나는 새로운 MyImage와 MyImage의 요소 인 새로운 pImage를 사용할 수 없다고 말합니다. 어떻게해야합니까?

+6

둘째, 하나의 'new'는 항상 하나의 'delete'와 일치해야합니다 (물론 더 이상 데이터가 필요 없으면). – Nbr44

+2

그리고 이상적으로 당신은'MyImage'의 소멸자에서'delete [] pImage;를 가질 것입니다. 각 인스턴스는'pImage'를 소유하므로 인스턴스를 지우는 책임이 있습니다. – BoBTFish

+2

각'new'에 대해'delete'가 필요합니다. 각각의'new []'에는'delete []'가 필요합니다. – juanchopanza

답변

-1

내가 myimage을에 생성자와 소멸자를 구현하는 것 :

struct MyImage 
{ 
    MyImage() : pImage(nullptr), width(0), height(0) 
    { 
    } 

    ~MyImage() 
    { 
     delete [] pImage; 
    } 
    BYTE* pImage; 
    int width; 
    int heigth; 
}; 

일반적으로,이 pImage, 폭과 높이가 개인 회원 클래스를 만들 수하는 것이 좋습니다.

+2

이 클래스는 안전을 위해 복사 생성자 및 복사 할당 연산자도 필요합니다. –

3

두 번째 옵션은 좋은 것입니다 감사합니다 :

delete[] pMyImage->pImage; 
delete pMyImage; 

new 항상 delete과 일치해야하고, new[] 항상 delete[]과 일치해야합니다.

마지막으로
MyImage::~MyImage() 
{ 
    delete [] pImage; 
} 

, 당신이 가지고하는 것이 좋습니다 :

MyImage

당신은 MyImage 소멸자에 delete[] pMyImage->pImage;을 배치 할 수 있습니다 ... 오류를 방지하기 위해이 데이터를 확보/할당에 대한 책임을 져야한다 C++에서 스마트 포인터를 살펴보십시오. 예를 들어 std::unique_ptr에 :

목적은 파괴되고, 메모리는 다음 중 하나가 발생하면 해제

:

  • 오브젝트가 파괴 관리시 unique_ptr 객체를 관리하는 것이 통해 다른 포인터를 할당 unique_ptr
  • operator =() 또는 reset().

Deleter (ptr)를 호출하여 사용자가 제공 한 잠재적 Deleter를 사용하여 개체를 파괴합니다. Deleter는 객체의 소멸자를 호출하고 메모리를 분배합니다. 그런

뭔가 :

#include <memory> 

struct MyImage 
{ 
    std::unique_ptr<BYTE[]> m_Image; 
    int width; 
    int heigth; 
}; 

MyImage* pMyImage = new MyImage; 
pMyImage->m_Image= std::unique_ptr<BYTE[]>(new BYTE[ width * height ]); 
+2

왜 소멸자의 조건은 무엇입니까? 나는'delete'와'delete []'가 널 포인터를 받아 들여 그것을 무시할 것으로 기대하고 있으며, http://cppreference.com에 대한 빠른 검색은 이것을 확인하는 것으로 보인다. – delnan

+0

@delnan 죄송합니다, 약간의 실수는 :/내 코드를 편집했습니다. –

+0

걱정할 필요가 없습니다. 테스트를 직접 수행해야하는 이유를 놓친 것인지 궁금합니다. – delnan

1

올바른 사람은

delete[] pMyImage->pImage; 
delete pMyImage; 

당신은 예를 들어, 몇 가지 예외와 함께 (A delete[]deletenewnew[] 일치해야합니다입니다 라이브러리가 Qt와 부모/자식 시스템과 같은 메모리 자체를 처리한다는 것을 알고있을 때)

+0

답변 해 주셔서 감사합니다. – user2590664

1

두 번째.new 또는 new[]을 사용하여 수동으로 할당 한 메모리는 각각 delete 또는 delete[]을 사용하여 수동으로 할당을 해제해야합니다.

+0

답변 해 주셔서 감사합니다. – user2590664

+0

@ user2590664 문제는 없습니다. 행운을 빌어 요. – maditya

6

두 번째 대안은 정확할 수 있지만 처음에는 delete (예 : 잊어 버리는 것을 잊음) 오류가 발생하는 것을 피하기 위해 적절한 도구를 사용하는 것이 좋습니다.

예를 들어, 동적으로 할당 된 BYTE 배열이 std::vector의 좋은 후보 일 수 있습니다. MyWidget은 일종의 스마트 포인터로 관리 할 수 ​​있습니다. std::unique_ptr 또는 std::shared_ptr 등이있다. 또는 동적으로 할당 할 필요가 없지만 스택에 생성 한 다음 필요한 경우 주소를 전달할 수도 있습니다. 그래서,이 같은 아마 뭔가 :

// An example function dealing with images. This one draws it. 
void draw(MyImage *img); 

struct MyImage 
{ 
    std::vector<BYTE> image; 
    int width; 
    int heigth; 
}; 

MyImage myImage; 
myImage.image.resize(width * height); 
// ... 
draw(&myImage); 
+0

이제 올바른 방향으로 나아갑니다. –

관련 문제