gpt4 book ai didi

c++ - 在 C++ 中通过析构函数销毁动态数组的 vector

转载 作者:行者123 更新时间:2023-11-28 04:52:35 25 4
gpt4 key购买 nike

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

我的应用程序结构

类(class)形象

  • rgb 结构:包含 float (它们是扁平像素)和重载运算符。
  • 像素:一维像素数组,通过构造函数初始化为 h * w
  • 类析构函数。

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

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

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

类过滤器:公共(public)类图像

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

派生类的析构函数。

~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 对象中,该对象将图像存储在 vector 容器中以执行我的所有功能。在运行时,使用的空间约为 1.3GB,但由于我的对象处于循环中(我有一个用于多种功能的菜单)对象通常不会离开范围,因此不会自动调用析构函数,所以我调用像这样手动; medianImage->~Blend();现在所有的错误都说我的应用程序“触发了一个断点”,仅此而已……注意,在任何地方都找不到断点。我知道使用动态数组通常是不好的,因为它会导致各种内存问题(如果它是由我完成的),但我想解决这个问题,以便我知道将来如何解决这些问题。

如果您对代码有任何疑问,我可以发布截图。

编辑:这是我的 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;
}
};

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

关于c++ - 在 C++ 中通过析构函数销毁动态数组的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47851941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com