代码很短,直接贴上:
#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两次,为什么?
預設情況下,你不寫複製建構函數,編譯器會自動為你產生一個預設的複製建構子和operator=
預設行為類似下面這樣:
逐一複製資料成員的值,包括指標也指向原始位址。
稱為淺複製
你需要加一個複製建構子和operator=
重新new一個屬於這個物件自己的空間,然後複製原始物件指標成員所指向的數據,稱為深複製。
然後,你就可以在析構函式裡delete屬於自己的指標成員了。
刨墳要死啊
我先跟你說為什麼不能delete。因為求組a在堆疊上,構造函數呼叫後就釋放掉了。
只能說你的程式有問題,至於說記憶體一樣,那都是後話了
你的函數f每次執行都會存取的是已經釋放掉的記憶體