C++ 构造函数中的创建的数组内存地址相同
PHP中文网
PHP中文网 2017-04-17 13:59:41
0
2
303

代码很短,直接贴上:

#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两次,为什么?

PHP中文网
PHP中文网

认证0级讲师

全部回覆(2)
Peter_Zhu

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;
}
巴扎黑

刨墳要死啊

我先跟你說為什麼不能delete。因為求組a在堆疊上,構造函數呼叫後就釋放掉了。

只能說你的程式有問題,至於說記憶體一樣,那都是後話了

你的函數f每次執行都會存取的是已經釋放掉的記憶體

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板