c++ - 如何删除以防止内存泄漏?

标签 c++ memory-leaks

真的真的很感谢给我帮助的人,谢谢你们!

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。 正如 friend 所说,如下所示,我不能新建 MyImage 和新建 pImage,即 MyImage 的元素。 我应该怎么办?谢谢

最佳答案

你的第二个选择是正确的,但为了避免你一开始就错误地调用 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);

关于c++ - 如何删除以防止内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17940978/

相关文章:

c++ - pass-by-reference & 和 * 之间的区别?

C++/QML : How to define and handle multiple contexts for dynamically created components?

C++ vector<string> 段错误

c - 如何释放内存?

我根本找不到C内存泄漏

android - 多个屏幕更改时的位图 OutOfMemory

c++ - 基于区间的数据结构(类似于boost icl)

c++ - 在 C++ 中制作一个安全的缓冲区持有者

javascript - Javascript/垃圾收集器中的循环引用

c++ - 编译器是否每次都实例化默认构造函数和复制构造函数以及复制赋值运算符?