2011-03-07 101 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