这个bug正在扼杀我。我已经大大简化了代码(这些是类中的虚函数,如果它有帮助的话),但这是它的主旨。我传递一个指针,无论出于何种原因,调用函数都没有得到相同的值。
提前致谢。
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,则会出现访问冲突异常。
再次感谢。
答案 0 :(得分:3)
两件事:
您正在通过值传递指针。它被复制到函数中,但对指针的更改是 local 。如果要更改指针,则需要通过引用 传递:
bool getTable(int tableNum, DataTable*& outputTable)
更好的是,返回新创建的对象并摆脱(看似毫无用处?)bool
返回值。
摆脱VS6。它是古老的,错误的,基本上无法应付现代C ++。事实上,它会强制你编写坏 C ++代码,因为好的,惯用的C ++代码需要在VC ++ 6中不起作用的功能。此外,IDE仅比现代可用性标准落后十年。
答案 1 :(得分:2)
您不会从outputTable
返回getTable
。相反,您返回true
。您将构造的表分配给调用者永远不会看到的临时变量。相反,它的theTable
变量仍保持单元化。
你应该返回它(敏感选项)或传递指针指针/引用指针(硬选项):
DataTable *getTable(int tableNum)
{
// ... unrelated work ...
DataTable *outputTable = new DataTable();
cout << "outputTable= " << outputTable << endl;
return outputTable;
}
如果出现问题,并返回0
(空指针)而不是false
。如果可能发生,请务必检查。投掷和捕获异常可能会更好。
答案 2 :(得分:1)
您只是在创建指针的本地副本。将其作为引用或指针指向。 E.g:
bool getTable( int tableNum, DataTable*& outputTable )
答案 3 :(得分:1)
bool getTable( int tableNum, DataTable* outputTable )
outputTable
是一个指针变量,仅在执行此函数时才存在。
将新创建的对象分配给此指针基本上只是将指针重新指向新变量,它不会修改outputTable
当前指向的内存。
如果你想在这个函数中修改'外部世界',你可能需要像这样声明你的函数,并在适当的时候修改里面的代码。
bool getTable( int tableNum, DataTable** outputTable )
(虽然C ++引用可能更惯用。)
答案 4 :(得分:0)
C / C ++是按值传递的,而不是参考。
您正在将theTable的值传递给函数,然后更新它,这不会更改调用函数中的值。
你需要这样做:
getTable (tableNum, &theTable);
在getTable函数中你需要做:
*outputTable = new DataTable()
或者,您可以更改getTable()函数声明以通过引用传递:
bool getTable( int tableNum, DataTable* &outputTable )