在c ++中通过析构函数销毁动态数组的向量

问题描述 投票:0回答:1

我正在处理一个与图像处理(混合和缩放)有关的任务,我遇到了一个我很难克服的问题。

我的申请结构

班级形象

  • rgb struct:包含浮点数(它们是扁平像素)和重载运算符。
  • 像素:1d像素阵列,通过构造函数初始化为h * w
  • 类析构函数。

析构函数看起来有点像这样......

virtual ~Image()
{
    if (pixels != NULL)
        delete[] pixels;
}

现在我正在使用另一个名为Filter的类,它继承自Image

class Filter:公共类Image

  • std :: vector of Image imgStack;我要混合的图像容器
  • stg :: Rgb pixelBuffer的向量;用于每个图像的像素的容器一个像素。这不是动态的,所以我不担心删除它。

派生类的析构函数。

~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;
    }
};
c++ oop inheritance destructor virtual-destructor
1个回答
1
投票
#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;
    }
};

最好编写一个函数来清理内存,并在使用动态内存时从容器中删除特定元素,而不是使用类的析构函数。

© www.soinside.com 2019 - 2024. All rights reserved.