(大约一个小时前我问了一些关于我的代码并且不小心删了帖子而不是编辑它。对于那些善意回答我的人我很抱歉。但是,因为我编辑了我的代码并且部分修复了这个问题,所以我我宁愿在这里要求新的交易。)
我有一个班级,我班上有一个结构。由于我希望能够打印其内容,因此我重载了ostream
运算符:
struct packetarray {
const value_type *pktarr;
positive length;
packetarray() : pktarr(0), length(0) {}
packetarray(value_type *v, positive l) : pktarr(v), length(l) {}
~packetarray() {
delete[] pktarr;
pktarr = 0;
length = 0;
}
friend std::ostream &operator<<(std::ostream &os, const packetarray &p) {
os << "[ ";
for (int j = 0; j < p.length; ++j) {
os << p.pktarr[j];
if (j < (p.length - 1)) {
os << ",\t";
}
}
os << " ]";
return os;
}
};
我的模板类value_type
为typedef T
。
我有一个方法packet
,它返回一个packetarray
对象:
packetarray* packet(positive y, positive x) {
try {
if (y >= this->y || x >= this->x) {
throw OutOfBounds();
}
value_type *v = new value_type[this->z];
for (int z = 0; z < this->z; z++) {
v[z] = this->operator()(z, y, x);
}
packetarray *p = new packetarray(v, this->z);
v = 0;
return p;
}
catch (const OutOfBounds &e) {
std::cout << e.message() << std::endl;
packetarray *p = new packetarray();
return p;
}
}
正如你所看到的,当我写value_type *v = new value_type[this->z]
时,我在堆上分配内存,后来应该被释放的内存。但是,由于此内存与我的pktarr
结构的packetarray
指针共享,因此我无法释放内存,因为我安全地返回(并打印)了我的packetarray
对象的内容。
我的意图(期望?)是删除packetarray
析构函数中的那部分内存 - 但即使我实际上通过编写packetarray
在堆上创建了一个packetarray *p = new packetarray(v, this->z)
对象,也没有析构函数是在程序结束时被调用。那么,我应该如何释放我需要分配的内存以初始化我的packetarray
对象?
(对于那些想知道我的班级做什么的人:它基本上是一个三维数组,packet
方法返回一个数据结构,其中包含每个平面的某个(y,x)位置的所有元素ž。)