나는 이미지 조작 (블렌딩 및 확대/축소)과 관련된 과제 중 하나를 수행하고 있으며 어려움을 극복해야한다는 문제에 봉착했습니다. 내 응용 프로그램의C++의 소멸자를 통해 동적 배열의 벡터를 소멸
구조
- RGB 구조체
클래스 이미지 : 오버로드 운영자 (그들은 평평 픽셀이야) 수레가 포함되어 있습니다.
- 픽셀 : 생성자를 통해 h * w가되도록 초기화되는 1 차원 픽셀 배열
- 클래스 소멸자. 공용 클래스 이미지 :
소멸자 지금
virtual ~Image()
{
if (pixels != NULL)
delete[] pixels;
}
내가 이미지에서
클래스 필터를 상속 필터라는 다른 클래스를 사용하고 ... 조금 다음과 같습니다
- 이미지의 벡터 imgStack; 블렌드 할 이미지의 컨테이너
- std :: vector of Rgb pixelBuffer; 각 이미지 1 픽셀의 픽셀 컨테이너입니다. 이것은 동적이 아니므로 삭제를 걱정하지 않아도됩니다.
파생 클래스의 소멸자. 나는 기본적으로 벡터에 이미지를 저장하는 혼합 객체에 13 개 이미지를 실행 해요 내 MAIN.CPP의이 부분이 어떻게 생겼는지
~Blend()
{
delete &imageStack;
}
... 내 MAIN.CPP에서
while (userInput != 5)
{
switch(userInput)
case 1:
{
Blend *meanImage = new Blend(3263, 2505, 13);
meanImage->writePPM("Mean_" + std::to_string(count) + ".ppm");//every iteration, the file name is unique
meanImage->~Blend();
}
}
내 모든 기능을 수행 할 컨테이너. 실행 시간 동안 사용 된 공간은 약 1.3GB이지만 내 객체가 루프에 있으므로 (다중 기능을위한 메뉴가 있음) 객체는 대개 범위를 벗어나지 않으므로 소멸자가 자동으로 호출되지 않으므로 호출합니다 그것은 수동으로 이것을 좋아한다; medianImage-> ~ Blend(); 이제 모든 오류는 내 응용 프로그램이 "중단 점을 트리거했습니다."라는 오류 메시지가 표시됩니다. 참고로 중단 점은 어디에도 없습니다. 동적 배열을 사용하는 것은 일반적으로 모든 유형의 메모리 문제를 일으키는 것이 일반적으로 나쁘다는 것을 알고 있습니다.하지만이 문제를 해결하기 위해 앞으로 이러한 문제를 해결하는 방법을 알고 싶습니다.
코드에 대한 질문 사항이 있으면 snippers를 게시 할 수 있습니다.
편집 : 여기 내 블렌드 수업이 있습니다.
#pragma once
#include "stdafx.h"
#include "Image.h"
#include <vector>
#include <string>
class Blend : public Image
{
private:
std::vector<Image> imageStack;
std::vector<Rgb*> pixelBuffer;//only works with pointers (no copying)
int m_noOfImages;
Rgb* getMedianFromSet();
Rgb getMeanFromSet();
Rgb getStdDev(Rgb meanPix);
public:
Blend(int width = 0, int height = 0, int noOfImages = 0):Image(width, height), m_noOfImages(noOfImages), imageStack(noOfImages), pixelBuffer(noOfImages)
{}
public:
void stack(bool push = true);
void meanBlend();
void medianBlend();
void sigmaClipping(float sigma = 0.5f);
~Blend()
{
delete &imageStack;
}
};
소멸자를 호출하면 안됩니다. 대신 meanImage를 삭제하십시오. 또는 더 나은 아직 새로운 것을 사용하지 않으며 전혀 삭제하지 마십시오. 현대 C++은 new/delete의 사용을 권장하지 않습니다. – drescherjm
'delete & imageStack;'이것은 틀린 것 같습니다. – tkausl
정의되지 않은 동작이 발생할 가능성이 큽니다. –