我正在处理一个与图像处理(混合和缩放)有关的任务,我遇到了一个我很难克服的问题。
我的申请结构
班级形象
析构函数看起来有点像这样......
virtual ~Image()
{
if (pixels != NULL)
delete[] pixels;
}
现在我正在使用另一个名为Filter的类,它继承自Image
class Filter:公共类Image
派生类的析构函数。
~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();
}
}
在我的main.cpp中,我基本上将13个图像运行到Blend对象中,该对象将图像存储在矢量容器中以完成我的所有功能。在运行时,使用的空间大约为1.3GB,但由于我的对象处于循环中(我有一个多功能菜单),对象通常不会离开作用域,因此析构函数不会自动调用,所以我调用它像这样手动; medianImage->〜共混物();现在所有的错误都说我的应用程序“已经触发了一个断点”,就是这样......注意,在任何地方都找不到断点。我知道使用动态数组通常很糟糕,因为它会导致各种内存问题(如果由我完成),但我想解决这个问题,所以我知道将来如何解决这些问题。
如果您对代码有任何疑问,我可以发帖子。
编辑:这是我的Blend课程。
#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;
}
};
#pragma once
#include "stdafx.h"
#include "Image.h"
#include <vector>
#include <string>
#include <memory>
class Blend : public Image
{
private:
std::vector<Image> imageStack;
// Changed to shared_ptr<T> could use unique_ptr<T> depending on need.
std::vector<std::shared_ptr<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);
// Clear Entire Buffer
void cleanup() {
// When using the heap with smart pointers
for ( auto item : containerVariable ) {
item.reset();
item = nullptr;
}
containerVariable.clear();
}
// Remove Single Element
void remove( unsigned idx ) {
// Write function to remove a single element from vector
}
~Blend()
{
// This is definitely wrong here: You are trying to delete a reference
// to a template container that is storing `Image` objects that
// are on the stack.
// delete &imageStack;
}
};
最好编写一个函数来清理内存,并在使用动态内存时从容器中删除特定元素,而不是使用类的析构函数。