我在析构函数中调用delete但它说:undentifier“data”未定义!不应该删除析构函数中的工作?
struct Coada
{
Coada(int size_max=0)
{
int prim = -1;
int ultim = -1;
int *data = new int[size_max];
}
~Coada()
{
delete[] data;
}
};
答案 0 :(得分:1)
要删除指针,必须存储指针的值直到删除点。由于指针data
仅在构造函数返回之前存在,并且没有指针值的副本,因此在构造函数返回后不能删除指针。由于之前未删除,因此分配的内存将泄露。
此外,无法在其范围之外访问变量。 data
是构造函数的局部变量,不能在该函数之外访问。析构函数中没有变量data
;因此来自编译器的错误。
因此,如果您在函数中分配了某些内容,并且不希望在该函数中释放它,则必须将指针存储在某处。由于您分配的函数是构造函数,因此将指针存储在成员变量中是很自然的。析构函数可以访问成员变量,因此可以删除指针。
但是,请记住,C ++程序员极少需要进行手动内存管理。应该尽可能避免。例如,在这种情况下,使用std::vector
来分配动态大小的数组是明智的。
答案 1 :(得分:0)
其他人说的一切都是正确的,你应该遵循它 回答你的问题。是的,如果你做得对,删除应该在析构函数中工作。以下是一个如何工作的示例:
struct Coada{
Coada(int size_max=0){
int prim = -1;
int ultim = -1;
data = new int[size_max];
}
~Coada(){
delete[] data;
}
private:
int* data;
};
你可以看到我将data
声明为struct Coada的成员变量,因此我可以在这个结构中的任何地方访问它,也可以在析构函数中访问它。
但是你会在一本好的c ++书中学到所有这些。
享受阅读:)
答案 2 :(得分:0)
这应该使用您的对象的类:
class Coada {
private:
int prim;
int ultim;
int *data;
public:
Coada(int size_max=0)
{
this->prim = -1;
this->ultim = -1;
this->data = new int[size_max];
}
~Coada()
{
delete[] this->data;
}
};
int main(void)
{
Coada my_coada(4);
return 0;
}