2016-11-30 37 views
0

我不能真正想到一個好的方法來描述這一點,但我不知道爲什麼,即使它會編譯,它在執行時崩潰。 我試圖調用類的功能,nextTrain(),以我的類指針,貼切,它的工作之前,我重新分配指針,不過,這條線在重新分配指針後使用類指針功能

apt = apt->nextTrain() 

同級功能無法調用的任何後更長的時間。

全碼:

#include <iostream> 
#include <string> 

using namespace std; 

class train { 
public: 
    string cars[100]; 
    int index; 
    int total; 
    train(string n) { cars[0] = n; index=0; total=0;} 
    train(string c[100], int ix, int t) { 
     for (int i = 0; i < 100; i++) { 
      cars[i] = c[i]; 
     } 
     index = ix; total = t; 
    } 
    train* nextTrain() { 
     train t(cars, index, total); 
     train* ret = &t; 
     ret->atoix(1); 
     return ret; 
    } 
    train* prevTrain() { 
     train t(cars, index, total); 
     train* ret = &t; 
     ret->atoix(-1); 
     return ret; 
    } 
    void atoix(int val) { 
     index += val; 
    } 
    void add(string name) { 
     cars[total+1] = name; 
     total++; 
    } 
    string getName() { 
     return cars[index]; 
    } 
}; 

int main() 
{ 
    train a("Engine"); 
    train* apt = &a; 
    apt->add("Train2"); 
    apt->add("Train3"); 
    cout << apt->nextTrain()->getName() << endl; 
    apt = apt->nextTrain(); 
    cout << apt->getName() << endl; 
    cout << apt->nextTrain()->getName() << endl; 
    cout << apt->prevTrain()->getName() << endl; 
    cout << apt->getName() << endl; 
} 
+0

'列車噸(汽車,指數,總); train * ret =&t; return ret;'是:(1)創建局部變量(2)在函數結束時獲取它的指針(3),稍後破壞局部變量(4),訪問曾經存放局部變量的存儲器並得到未定義的行爲。 – grek40

回答

3

如果我們的代碼在nextTrain功能仔細一看:

train t(cars, index, total); 
train* ret = &t; 
... 
return ret; 

變量t是函數內部本地變量。當函數返回t將超出範圍並且對象將被銷燬。但是,您返回一個指向此局部變量的指針。一旦變量超出範圍,它就不存在了,使用這個(現在無效的)指針將導致未定義的行爲

你應該怎麼做來解決這個問題取決於你將如何使用它。我的建議是不從函數返回一個指針,但返回一個對象實例。即

train nextTrain() { 
    train t(cars, index, total); 
    t.atoix(1); 
    return t; 
} 

甚至

train nextTrain() { 
    return train(cars, index+1, total); 
} 
+0

這樣一個簡單的錯誤,通過改變語句來訓練* ret =新火車(汽車,指數,總數),能夠輕鬆修復; 謝謝! –

+0

此外,我正在爲一個C++類做這個,所以我*有*作爲指針返回它。 –

+1

@CollinK然後記住,你'新'你必須'刪除'。 –