如何在析构函数中删除?

时间:2018-03-14 12:33:01

标签: c++ class destructor

我在析构函数中调用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;
        }


    };

3 个答案:

答案 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;
}