c++ - 重新分配变量,调用两次删除 (C++)

标签 c++ arrays constructor

我的编程背景是 Java 世界,但我才刚刚开始学习 C++。作为一名 Java 程序员,我偶然发现了这个相当微不足道而且可能相当菜鸟的问题,它让我感到困惑:

我有一个带有数组的类,它在构造函数中通过 new 初始化并在析构函数中删除。现在,当我创建此类的一个对象并将此类的另一个对象分配给同一个变量时(至少我是这么认为的),当变量离开时,析构函数中的 delete[] 方法似乎被调用了两次范围(在本例中为 main() 函数)(调试器给我一个 _BLOCK_TYPE_IS_VALID 断言失败警告)。

这是为什么呢?为什么在我将新对象分配给 f 之前不调用解构函数?我如何明确删除 Foo(1)?这里到底发生了什么?

class Foo{
    private:
        int *field;

    public:

    Foo(int size){
       field = new int[size];
    }

   ~Foo(){
       delete[] field;
    }
};


int main(){
    Foo f = Foo(1);
    f = Foo(2);
}

最佳答案

C++ 世界中有一种叫做 Rule Of Three 的东西.

类会自动为您生成析构函数复制构造函数赋值运算符

如果您必须手动定义其中一个函数,您可能必须定义所有这三个函数。

在您的情况下,您应该定义两个复制函数,以便 Foo 的拷贝获得其自己的 field 拷贝。添加这两个函数:

class Foo{

    Foo( const Foo &f ) {
        size = f.size;
        field = new int[size]; 
        std::copy( f.field, f.field + size, field );
    }

   Foo& operator=( const Foo &f ) {
       // Leverage the logic that was already written in the copy constructor
       Foo tmp(f);
       std::swap( *this, temp );
       return *this;
   }
};

请注意,我假设您已将 size 存储在 Foo 对象中。无论如何,您可能需要将这些信息存储在现实生活中的应用程序中

关于c++ - 重新分配变量,调用两次删除 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15488936/

相关文章:

c++ - 从 C++ 调用 Lua 函数

c++ - OpenCV C++,找到描述物体形状的方程

php - array_search 和 destroy 逻辑错误

java - 利用 BinarySearch 进行自动完成练习

javascript - 在 JavaScript 中创建命名空间

c++复制构造函数中的用户定义成员

c++ - Opengl - 使用纹理图集绘制圆柱体

c++ - 在 Visual Studio C++ 中设置 PYTHONPATH 环境变量

javascript - Vue.js 不使用 TextTrackCueList 更新 DOM

dart - 命名构造函数是 Dart 中生成构造函数的子集吗?