2017-07-25 27 views
-3
#include <iostream> 
using namespace std; 

class station{ 
    int n; 
    float *p; 
public: 
    station(){}; 
    station(const station &ob){cout<<"Copy";} 
    station operator=(station* a){cout<<"Nai";} 
    ~station(){cout<<"Destructor";} 
    static float counter; 
    friend istream &operator>(istream &stream, station &d); 
    int &getN(){return n;}; 
    float *&getP(){return p;}; 
    void* operator new[](size_t size); 
    void* operator new(size_t size){station *a;a=::new station;return a;}; 


}; 
void* station::operator new[](size_t size){ 
    station* a; 
    a=(::new station[size]); 
    int b; 
    b=(size)/(sizeof(station)); 
    for(int i=0;i<b;i++){ 
     cin>a[i]; 
    } 
    cout<<a; 
    return a; 
} 



float station::counter; 
istream &operator>(istream &stream, station &d){ 
    cout<<"Dwse arithmo deigmatwn"; 
    int num; 
    stream>>num; 
    d.getP()=new float[num]; 
    d.getN()=num; 
    for(int i=0;i<num;i++){ 
     stream>>d.getP()[i]; 
    } 
    return stream; 
} 



int main(){ 
    station* a; 
    a=new station[2]; 
    cout<<a; 
    return 0; 
} 

大家好, 這是我的第一篇文章,所以請原諒我的任何錯誤。超負荷新退貨錯地址

我創建了一個新的類,帶有一個新的運算符和一個提取器的重載。我的問題是,由new返回的地址與在重載操作符內部的地址不同,因爲您可以在說明cout<<a的行中看到該地址。但是,當我刪除析構函數時,一切正常。有任何想法嗎?

+3

爲什麼你重載輸入流的大於比較運算符? –

+0

我只是在重載操作符。 –

+1

那麼,你在鍛鍊如何做錯事? –

回答

3

當使用new[]操作符時,編譯器可以爲內部簿記分配一些額外的空間(例如存儲數組大小,因此當調用delete[]時,它將知道要銷燬多少個對象)。這就是你在「原始」分配和最終數組分配對象地址之間所看到的差異。

這也是爲什麼你不應該在通過new[]分配的內存上調用delete,反之亦然,因爲它可能導致內存泄漏(只有第一個對象被銷燬),訪問無效數據和/或釋放壞指針(技術上所有UB)。


編輯

爲對象內容的問題,你不應該來初始化operator new[]的對象這樣

for(int i=0;i<b;i++){ 
    cin>a[i]; 
} 

運營商新/新[]僅僅是分配「原始」內存。

簡單地刪除,如果你希望(構造函數是由編譯器自動爲陣列中的每個對象調用)讀構造函數中的對象,如:

station(){cin >> *this}; // or '>' if you really want to keep that 

但總的來說,閱讀從流通常是明確完成的,所以你可以做例如:

a=new station[2]; 
for(int i=0;i<2;i++){ 
    cin>a[i]; 
} 

main()

+0

但是,當我嘗試使用對象的函數訪問數據時,它返回垃圾! –

+1

我想這是因爲'for(int i = 0; i a [i];}' - 你不應該在'operator new'中初始化對象,在構造函數中這樣做。 – axalis