我正在从事纹理合成项目。我快完成了,但是我的进程在运行时占用了约2gb的内存。我以为我要释放所有的calloc'ed数组,但是我可能错了。 C++不是我的专长。
我知道在C++中使用三重指针是错误的方法,但目前我对它们更加满意。让我知道是否需要查看更多代码。谢谢。
MetaPic声明
class MetaPic
{
public:
Pic* source;
Pixel1*** meta;
int x;
int y;
int z;
MetaPic();
MetaPic(Pic*);
MetaPic(const MetaPic&);
MetaPic(int, int, int);
MetaPic& operator=(const MetaPic&);
~MetaPic();
void allocateMetaPic();
void copyPixelData();
void copyToOutput(Pic*&);
void copyToMetaOutput(MetaPic&, int, int);
void copyToSample(MetaPic&, int, int);
void freeMetaPic();
};
分配三重指针
void MetaPic::allocateMetaPic()
{
meta = (Pixel1***)calloc(x, sizeof(Pixel1**));
for(int i = 0; i < x; i++)
{
meta[i] = (Pixel1**)calloc(y, sizeof(Pixel1*));
for(int j = 0; j < y; j++)
{
meta[i][j] = (Pixel1*)calloc(z, sizeof(Pixel1));
}
}
}
释放三重指针
void MetaPic::freeMetaPic()
{
for(int j = 0; j < y; j++)
{
for(int i = 0; i < z; i++)
free(meta[i][j]);
}
for(int i = 0; i < x; i++)
free(meta[i]);
free(meta);
}
析构函数
MetaPic::~MetaPic()
{
freeMetaPic();
}
=运算子
MetaPic& MetaPic::operator=(const MetaPic& mp)
{
freeMetaPic();
source = mp.source;
x = mp.x;
y = mp.y;
z = mp.z;
allocateMetaPic();
copyPixelData();
return *this;
}
复制构造函数
MetaPic::MetaPic(const MetaPic& mp)
{
source = mp.source;
x = mp.x;
y = mp.y;
z = mp.z;
allocateMetaPic();
copyPixelData();
}
最佳答案
释放时,您似乎在循环中使用了错误的终止值。只需使freeMetaPic函数撤消分配函数的作用即可,即:
void MetaPic::freeMetaPic()
{
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
free(meta[i][j]);
}
free(meta[i])
}
free(meta);
}