【问题标题】:Class Destructor Error类析构函数错误
【发布时间】:2012-07-04 07:32:42
【问题描述】:

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

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];
        }
    }

和赋值运算符:

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

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

    a_vector.~vector_of_int();
    b_vector.~vector_of_int();
    c_vector.~vector_of_int();
    cout << "\n";
    system("pause");
    return 0;

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

谢谢。

【问题讨论】:

  • +1 表示相关代码以及您遵守规则 3 的事实。hmjd 指出了解决方案。
  • 您的复制构造函数看起来正确。使用copy-and-swap 实现赋值运算符,它是异常安全、防泄漏且简单的。

标签: c++ class destructor copy-constructor


【解决方案1】:

在赋值运算符中,您将项目从一个数组复制到另一个数组。但是,如果本地数组的大小小于传递给运算符的参数怎么办?您将超出数组的大小。

【讨论】:

    【解决方案2】:

    从代码中可以看出您正在显式调用析构函数。虽然这是合法的并且有一些用途,但您通常不应该显式调用析构函数,因为当对象超出范围时它们会被自动调用(或者 delete 被称为指针)。在已销毁的对象上执行析构函数是未定义的行为。

    在您的特定代码中,析构函数可能正在释放内存,第二次(在局部变量范围的末尾自动调用)它尝试释放已由您的手动调用释放并触发运行时的内存错误。

    【讨论】:

      【解决方案3】:

      我想你已经像这样创建了你的向量:

      vector_of_int v;
      

      然后不要删除它 - 它是自动存储。作用域结束时会自动删除

      如果您将矢量创建为:

      vector_of_int *v = new vector_of_int();
      

      调用delete运营商将其移除:

      delete v;
      

      【讨论】:

        【解决方案4】:

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

        此外,在赋值运算符中,this-&gt;size 已更新,但 an_array 未更新。如果a_vector.size &gt; this-&gt;size 则将导致对an_array 的越界访问,因为它没有足够的元素:delete[]new[] an_array

        【讨论】:

        • 嗨,我也是这么想的。我意识到尺寸可能更大的问题,并在我发布后修复了它。谢谢!
        猜你喜欢
        • 2011-05-19
        • 1970-01-01
        • 2015-07-09
        • 1970-01-01
        • 2017-05-27
        • 1970-01-01
        • 1970-01-01
        • 2011-02-14
        • 2013-12-23
        相关资源
        最近更新 更多