【发布时间】:2013-12-30 01:30:46
【问题描述】:
我有一个用于加载和存储(然后删除)图像数据(像素和标题)的类。在构造函数中,我像这样初始化数据和位图标题:
IMAGE_DATA::IMAGE_DATA():data(0)
{
memset(&fileheader,0,(sizeof(BITMAPFILEHEADER)));
memset(&infoheader,0,(sizeof(BITMAPINFOHEADER)));
};
data 是一个unsigned char* 数组,在加载函数中分配有new[...]。
析构函数:
IMAGE_DATA::~IMAGE_DATA()
{
freeData();
};
void IMAGE_DATA::freeData()
{
delete[] data;
memset (&fileheader, 0, sizeof(fileheader));
memset (&infoheader, 0, sizeof(infoheader));
};
现在的问题是,在过滤类中,我将加载数据后的类对象作为参数传递:
IMAGE_DATA image;
image.load("filename"); //load headers and pixel data
FILTER filter;
filter.scale(image,scalefactor,"outputfilename"); //scales the image and write to a .bmp
这是我的代码的缩短版本。所以,IMAGE_DATA ::load 运行顺利,但是当代码到达缩放函数时,我得到以下断言失败:
Debug Assertion Failed!
....
Expression:
_BLOCK_TYPE_IS_VALID(pHeap->nBlockUse)
....
在 crt\src\dbgdel.cpp 在 第 52 行。
这发生在我创建了析构函数之后。出于好奇,我更改了参数,因此我将它们作为参考传递。
/*FILTER::*/scale(IMAGE_DATA& /*passed as reference*/, unsigned short, const char*);
现在可以了。如果我通过“按值”传递,似乎调用了析构函数,但构造函数也应该调用,并且应该没有问题,因为在构造函数中我初始化了所有内容。
我想通过值传递它,因为我想保持原始不变,我只想使用它的数据。
如何在不作为参考传递的情况下使其工作,以及它与按值传递有何不同,因为按值传递似乎更“安全”。
编辑:我刚刚找到了一篇关于此的帖子:Side effects when passing objects to function in C++(我似乎没有使用正确的关键字进行搜索)所以从这篇文章中我读过我应该做一个复制构造函数和赋值运算符。
【问题讨论】:
标签: c++ memory-management c++11 destructor pass-by-value