C++ 对象超出范围

标签 c++ scope

对象Second何时超出范围?如果我保留第三个 cout 语句,则会出现编译器错误。即使我包围了 Second 和 cout 语句的初始化。

#include <iostream>
using namespace std;


class MyArray{

public:
    int Size;
    int* data;

    MyArray(int s) : Size(s), data(new int[s]){}
    ~MyArray(){
        delete[](this->data);
    }
};



int main()
{

    MyArray First(20);
    First.data[0] = 25;

    MyArray Second = First;
    cout << First.data[0] << endl;
    cout << Second.data[0] << endl;
    cout << Second.data[0] << endl;



    system("PAUSE");
    return 0;

}

运行时错误: enter image description here

最佳答案

事情是这样的:MyArray 对象在初始化时获得一个指向它们自己的名为 data 的整数数组的指针。然而,这一行改变了 Second 对象的内容:

MyArray Second = First;

现在,First.dataSecond.data 都指向同一个 int[] 数组,因为默认的复制构造函数和赋值运算符执行复制。

这很糟糕,因为编译器可以自由地在代码中最后一次使用First后销毁它。因此,访问 Second.data[0] 可能已经无效。

此外,一旦 FirstSecondmain() 末尾超出范围,它们都会 将尝试删除数据。只有第一个才会成功;第二个将触发未定义的行为。

为避免将来出现此类错误,请使用 rule of three 。它表示,如果您定义析构函数、复制构造函数或赋值运算符,则可能需要这三个函数。

您的代码只有析构函数。添加复制构造函数和赋值运算符将解决此问题,并防止分配 MyArray 对象时发生内存泄漏。

关于C++ 对象超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20298728/

相关文章:

javascript - 写入数组时 JavaScript 中的作用域问题

c++ - 在 Xcode 中将 C++ 与 OpenGL 结合使用

C++指针和数组基础

c++ - 带有 std::vector 和带有缩减的标量变量的 OpenMP for 循环

c++ - 由围绕矩形顺时针方向移动的数字组成的图案(长度和宽度每次都减小)

javascript - 网络应用程序 : modules speaking with each others

c++ - 使另一个实例成为模板类的 friend

c# - 局部变量错误

python - for/if循环和python中变量的范围

c++ - 没有在此范围内声明?