【问题标题】:C++ Pointer object lost outside of function?C++ 指针对象在函数之外丢失?
【发布时间】:2014-01-20 03:15:20
【问题描述】:

我创建了某个类的对象。该类是“节点”,它的属性为CString strName。这个变量的值可以通过Node的方法来获取:CString Node::GetName(),它只是返回变量的名字。

在下面的方法中我实例化了这个:

Node* UpperClass::GetObject(CString value) {
    Node retObject;
    retObject.strName = value;

    Trace(retObject.strName); // Prints argument to trace file - this prints the value of strName fine

    return &retObject;
}

然后我在第二个类中运行这个方法:

Node* LowerClass::Get() {
    Node *pReturn = instanceOfUpperClass.GetObject();

    Trace(pReturn->GetName()); // This trace just prints blank...

    return *(&pReturn);
}

从代码 cmets 中可以看出,当它传递给第二个方法时,它似乎丢失了值。我已经尝试对此进行研究,但在理解原因时遇到了一些真正的麻烦……有人可以帮忙吗?

顺便说一句,如果有人想知道第二种方法的返回值,我打算将结果指针传递给我利用它进行处理的第三个函数(混乱,我知道,但我继承了代码和别无选择);以防万一这对答案有任何影响。

提前致谢!

【问题讨论】:

  • retObject 是一个局部变量(自动变量),它的生命周期不会超过GetObject,在方法返回后试图引用该内存是未定义的行为。

标签: c++ visual-studio-2010 pointers methods reference


【解决方案1】:

int 这个方法:

Node* UpperClass::GetObject(CString value) {
    Node retObject;
    retObject.strName = value;

    Trace(retObject.strName); // Prints argument to trace file - this prints the value of strName fine

    return &retObject; // <-- Undefined Baaviour
}

您正在返回指向本地对象的指针,该对象在此方法结束后被销毁。您应该动态创建 retObject,并返回指向它的指针,或者最好将此指针放入 shared_ptr。

【讨论】:

  • 啊,我明白了,我认为这只是指针的固有差异,但诀窍是使用动态分配的内存!这也让我摆脱了那个可怕的返回值,因为第三种方法也可以正常工作。这一切都是有道理的。完成后我只需要记住释放内存...谢谢!
【解决方案2】:

Node retObject 是一个局部变量,当您超出函数GetObject 的范围时,对对象的任何使用都是未定义的。在这种情况下,您返回一个指向该对象的指针。

【讨论】:

  • 是的,所以即使指针似乎移动得很好,对象本身已经超出范围......现在很有意义。干杯!
猜你喜欢
  • 1970-01-01
  • 2012-12-17
  • 2011-04-19
  • 2016-12-04
  • 2013-01-18
  • 1970-01-01
  • 2012-10-12
  • 2017-09-30
  • 1970-01-01
相关资源
最近更新 更多