C++ 构造函数中的创建的数组内存地址相同

发布于 2022-09-03 07:52:18 字数 1254 浏览 16 评论 0

代码很短,直接贴上:

#include <iostream>
using namespace std;

class numbered
{
public:
    numbered()
    {
        int a[3] = {0, 0, 0}; // 每次构造函数所显示a的地址都是一样
        a[0] = num++;
        a[1] = a[0] + 1;
        a[2] = a[1] + 1;
        num = a[2] + 1;
        mysn = a;    // 明明有这个指针接手,为什么a的地址每次初始化还是一样?
    }

    static int num;
    int *mysn;
};

void f(numbered s)
{
    for (int i = 0; i != 3; i++)
        cout << s.mysn[i] << endl;
}

int numbered::num = 1;

int main(void)
{
    numbered a;
    numbered b;
//    numbered c;

    f(a);
    f(b);
//    f(c);
    return 0;
}

运行结果:

4
5
6
4
5
6

设想的是

1
2
3
4
5
6

Update:

#include <iostream>
using namespace std;

class numbered
{
public:
    numbered()
    {
        mysn = new int[3];
        mysn[0] = num++;
        mysn[1] = mysn[0] + 1;
        mysn[2] = mysn[1] + 1;
        num = mysn[2] + 1;
    }
    ~numbered()
    {
        delete [] mysn;
    }
    ...
};
...

int numbered::num = 1;

int main(void)
{
    numbered a;
//    numbered b;
//    numbered c;

    f(a);
//    f(b);
//    f(c);
    return 0;
}

为什么不能加析构函数呢?加了就delete两次,为什么?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

哥,最终变帅啦 2022-09-10 07:52:18

f(a)的时候产生了一个a的副本

默认情况下,你不写复制构造函数,编译器会自动为你生成一个默认的复制构造函数和operator=
默认行为类似下面这样:

numbered (const numbered& other)
{
    mysn = other.mysn;
}
numbered& operator=(const numbered& other)
{
    mysn = other.mysn;
    retun *this;
}

逐一复制数据成员的值,包括指针也指向原地址。
称为浅复制


你需要加一个复制构造函数和operator=

numbered(const numbered& other)
{
    mysn = new int[3];
    // 复制原对象数据
    for (i=0;i<3;++i)
    {
        mysn[i] = other.mysn[i];
    }
}
numbered& operator=(const numbered& other)
{
    mysn = new int[3];
    // 复制原对象数据
    for (i=0;i<3;++i)
    {
        mysn[i] = other.mysn[i];
    }
    retun *this;
}

重新new一个属于这个对象自己的空间,然后复制原对象指针成员指向的数据,称为深复制。
然后,你就可以在析构函数里delete属于自己的指针成员了。

~numbered()
{
    delete [] mysn;
}
不交电费瞎发啥光 2022-09-10 07:52:18

刨坟要死啊

我先跟你说一下为什么不能delete。因为求组a在栈上,构造函数调用后就释放掉了。

只能说你的程序有问题,至于说内存一样,那都是后话了

你的函数f每次执行都访问的是已经释放掉的内存

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文