类析构函数错误

wza*_*man 1 c++ destructor class copy-constructor

我正在做练习问题,问题是要创建一个析构函数以确保没有任何内存泄漏.当我使用这个析构函数时,我在执行系统后出现此错误("暂停");

http://imgur.com/r2bvF

这是复制构造函数:

    vector_of_int::vector_of_int ( const vector_of_int& a_vector )
    {
        an_array = new int[ a_vector.size ];

        this->size = a_vector.size;
        for( int i = 0; i < size; ++i )
        {
            an_array[i] = a_vector.an_array[i];
        }
    }
Run Code Online (Sandbox Code Playgroud)

和赋值运算符:

    vector_of_int& vector_of_int::operator= ( const vector_of_int& a_vector )
    {
        if( this == &a_vector )
        {
            return *this;
        }

        this->size = a_vector.size;
        for( int i = 0; i < size; ++i )
        {
            an_array[i] = NULL;
            an_array[i] = a_vector.an_array[i];
        }
            return *this;
     }
Run Code Online (Sandbox Code Playgroud)

我在网上搜索了一下,有人提到它可能是由于复制构造函数指向相同的内存位置.为了测试这一点,在我的main()函数中,我将数据推送到每个向量a,b,c中,并重新打印它们,它们都是不同的.调用析构函数后会显示此错误,然后进入下一行系统("暂停"); 按任意键后,显示.这是main()的结尾:

    a_vector.~vector_of_int();
    b_vector.~vector_of_int();
    c_vector.~vector_of_int();
    cout << "\n";
    system("pause");
    return 0;
Run Code Online (Sandbox Code Playgroud)

main.exe的花括号结束后,main.exe是否再次调用析构函数?当我评论所有3个析构函数语句时,错误不再显示.

谢谢.

hmj*_*mjd 9

不要明确地调用析构函数,当对象超出范围时会自动发生(从代码中,我相信在给定.用于调用析构函数的符号的情况下,向量是堆栈分配的).即使它们是在堆上分配使用new,你仍然不会显式地调用析构函数,而是使用它delete.

此外,在赋值运算符this->size中更新但an_array不是.如果a_vector.size > this->size那样它将导致越界访问,an_array因为它没有足够的元素:delete[]new[] an_array.