假设我有一个带有两个私有变量的C ++类。固定大小的数组data
和指向该数组的指针pnt
。
class MyClass
{
private:
double *pnt;
double data[2];
public:
myClass();
virtual ~MyClass();
double* getPnt() const;
void setPnt(double* input);
};
MyClass::MyClass()
{
double * input;
data[0] = 1;
data[1] = 2;
input= data;
setPnt(input);
}
MyClass::~MyClass()
{
delete this->pnt; // This throws a runtime error
}
void MyClass::setPnt(double * input)
{
pnt = input;
}
double * MyClass::getPnt() const;
{
return pnt;
}
int main()
{
MyClass spam; // Construct object
delete spam; // Error C2440: 'delete' cannot convert from 'MyClass' to 'void*'
}
此代码存在两个问题。首先,如果我尝试在对象上调用delete,我会得到:
错误C2440:'delete'无法从'MyClass'转换为'void *'
其次,如果我注释掉删除语句,我会得到一个实时错误,说明调试断言失败了!而这:
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
我的问题是:对于带有指向私有固定大小数组的指针的类,如何正确释放内存,编写/调用析构函数?
P.S我不能使用vector
或类似的好容器(因此这个问题)。
答案 0 :(得分:5)
我看不到静态数组。我看到一个固定大小的数组。此外,data
的内存也被分配为对象的一部分。
您不能明确删除该类的成员:删除操作符将处理该实例被动态分配的 IFF 。
{
MyClass x; // auto variable
} // x destructor run, no delete operator
VS
{
MyClass* x = new MyClass(); // heap allocation variable
delete x; // x destructor run, ::delete de-allocates from heap
}
答案 1 :(得分:2)
data
是一个子对象,当MyClass
实例消失时,它将被释放。编译器将在MyClass
析构函数中插入任何必要的代码,以便在释放内存之前调用所有子对象的析构函数。