2011-03-07 88 views
2

這個bug正在殺死我。我極大地簡化了代碼(這些都是類中的虛擬函數,如果有幫助的話),但這是它的精髓。我傳遞一個指針,出於任何原因調用函數沒有得到相同的值。奇怪的指針錯誤C++ MSVC6

在此先感謝。

bool getTable(int tableNum, DataTable* outputTable) 
{ 
    // ... unrelated work ... 
    outputTable = new DataTable(); 
    cout << "outputTable= " << outputTable << endl; 
    return true; 
} 

bool storeTable(int tableNum) 
{ 
    // ... 
    DataTable* theTable; 
    bool isWorking = getTable(tableNum, theTable); 
    cout << "theTable= " << theTable << endl; 
    // ... 
    return isWorking; 
} 

這個輸出是:

outputTable= 01ED8C20 
theTable= CCCCCCCC 

如果我嘗試使用theTable,我得到一個訪問衝突異常。

再次感謝。

回答

2

您不會從getTable返回outputTable。相反,您返回true。您將構建的表分配給調用方永遠不會看到的臨時變量。相反,其變量theTable保持單位。

你要麼返回它(明智的選擇),或者一個指針傳遞到指針/引用到指針(hard選項):

DataTable *getTable(int tableNum) 
{ 
    // ... unrelated work ... 
    DataTable *outputTable = new DataTable(); 
    cout << "outputTable= " << outputTable << endl; 
    return outputTable; 
} 

,並返回0(空指針),而不是如果出現問題,請致電false。一定要檢查是否可能發生。投擲和捕捉異常可能會更好。

+0

謝謝,這就是它! – 2011-03-07 09:11:33

+0

@Doug:然後請點擊此答案旁邊的複選標記以接受它。 – 2011-03-07 09:20:29

1

您只是新建指針的本地副本。將它作爲參考或指針傳遞給指針。例如: -

bool getTable(int tableNum, DataTable*& outputTable) 
+0

感謝您的幫助! – 2011-03-07 09:18:12

3

兩件事情:

  1. 您是按值傳遞指針。這是複製到功能,但指針的變化是本地。如果你想改變指針你需要參考通過它

    bool getTable(int tableNum, DataTable*& outputTable) 
    

    更重要的是,回報新創建的對象,並擺脫了bool返回值(看似無用的?)。

  2. 擺脫VS6。它是古老的,錯誤纏身的,基本上無法應付現代C++。實際上,它會強制你寫不好 C++代碼,因爲好的,慣用的C++代碼需要在VC++ 6中不起作用的功能。此外,IDE僅落後於現代可用性標準的十年。

+0

謝謝康拉德,就是這樣。我刪除了代碼,但我需要返回值。我們正在放棄MSVC6,但現在我堅持使用它。 – 2011-03-07 09:16:31

0

C/C++是按值傳遞的,而不是引用。

您正在將表格的值傳遞給函數,然後進行更新,這不會更改調用函數中的值。

你需要這樣做:

getTable (tableNum, &theTable); 

而在getTable功能,你需要做的:

*outputTable = new DataTable() 

或者你可以改變getTable()函數聲明通過引用傳遞:

bool getTable(int tableNum, DataTable* &outputTable) 
1
bool getTable(int tableNum, DataTable* outputTable) 

outputTable是一個指針變量,僅在執行此函數時才存在。

爲這個指針分配一個新創建的對象基本上只是將指針重新對準你的新變量,它不會修改當前指向的內存。

如果你想在這個函數中修改'外部世界',你可能需要像這樣聲明你的函數,並在適當的時候修改代碼。

bool getTable(int tableNum, DataTable** outputTable) 

(雖然C++的引用可能是更地道。)

+0

感謝您的幫助! – 2011-03-07 09:18:52