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;
}

我的代码如下,这个函数将 gdiImage 转换为 struct MyImage。作为朋友说,如下,我不能新建MyImage和新建pImage,MyImage的元素。我应该怎么办?谢谢你

4

5 回答 5

6

你的第二个选择是正确的,但为了避免你一开始就打电话delete(例如忘记这样做)错误,我建议使用适当的工具来解决这个问题。

例如,您的动态分配BYTE数组可能是std::vector. 可以通过MyWidget某种智能指针来管理,例如std::unique_ptrstd::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);
于 2013-07-30T07:48:54.550 回答
3

你的第二个选择是好的:

delete[] pMyImage->pImage;
delete pMyImage;

Anew必须始终与 a 匹配,delete并且 anew[]必须始终与 a 匹配delete[]

MyImage应该负责分配/释放这些数据以防止任何错误......

您可以将 放在delete[] pMyImage->pImage;MyImage构函数中:

MyImage::~MyImage()
{
    delete [] pImage;
}

最后,我建议你看看 C++ 中的智能指针。例如std::unique_ptr

当以下任一情况发生时,对象将被销毁并释放其内存:

  • 管理对象的 unique_ptr 被销毁
  • 通过 operator=() 或 reset() 为管理对象的 unique_ptr 分配另一个指针。

该对象通过调用 Deleter(ptr) 使用可能由用户提供的删除器销毁。删除器调用对象的析构函数并分配内存。

类似的东西:

#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 ] );
于 2013-07-30T07:39:31.410 回答
1

正确的是

delete[] pMyImage->pImage;
delete pMyImage;

您必须将 anew与 adelete和 anew[]与 a匹配delete[](有一些例外,例如当您知道库本身处理内存时,例如 Qt 及其父/子系统)

于 2013-07-30T07:40:30.620 回答
1

第二个。new您手动分配或new[]必须分别使用deleteor手动释放的任何内存delete[]

于 2013-07-30T07:40:42.767 回答
-1

我会在 MyImage 中实现构造函数和析构函数:

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

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

通常,最好将其设为 pImage、width 和 height 为私有成员的类。

于 2013-07-30T07:57:26.383 回答