奇怪的指针错误C ++ MSVC6

时间:2011-03-07 08:54:01

标签: c++ pointers

这个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,则会出现访问冲突异常。

再次感谢。

5 个答案:

答案 0 :(得分:3)

两件事:

  1. 您正在通过值传递指针。它被复制到函数中,但对指针的更改是 local 。如果要更改指针,则需要通过引用 传递

    bool getTable(int tableNum, DataTable*& outputTable)
    

    更好的是,返回新创建的对象并摆脱(看似毫无用处?)bool返回值。

  2. 摆脱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 )