0

我只问这个问题是因为我已经将它隔离为几乎三行代码,所以很明显我只是因为缺乏经验而搞砸了:

Movie* ptr;
if(title == r->getItem().getTitle())
{
    ptr = &(r->getItem());
    cout << "Found: " << ptr->getTitle() << "!";
}

本质上发生的事情就是title == "The Godfather"这样,因此这就是
r->getItem().getTitle()正在返回的内容。但我不明白的是,当我尝试创建一个指向Movie由返回的对象的指针时r.getItem(),我无法使用该指针。它肯定有分配给它的东西,但是当我尝试ptr->getTitle()返回 null 时。

到底是怎么回事?

4

3 回答 3

1

我认为你正在做这样的事情

Movie& getItem () {
   Movie m ();
   return m;
}

/* ... */

Movie * p = & (getItem ());

问题是 m 是一个堆栈对象,在 getItem 返回后会丢失。这是 C++ 中的一个常见错误。

getTitle 调用也不应该起作用,但它可能是偶然的。

您必须在堆上创建对象。

我避免这种情况的简单规则:不要完全使用 & 运算符,除非你十次没有考虑过你在做什么。

于 2012-05-28T08:19:19.520 回答
0

您应该发布更多代码。但很可能按值getItem返回一个对象,即它返回一个临时对象,它是原始对象的副本。分配后 - 这个临时对象被破坏,所以你指向一个被破坏的对象,(可能)无法访问的内存。ptr

于 2012-05-28T08:15:22.657 回答
0

这里可能会发生很多事情:

  1. getItem() 方法可能不会直接返回 Movie 类,该方法的定义是什么?它可能是一个继承的类,其中 getTitle() 的实现方式不同。
  2. 它可能会返回对类的引用,然后超出范围,导致内存错误。
  3. getTitle() 方法可能不会返回您可以流式传输的内容,它真的是一个字符串吗?该方法的定义是什么?
于 2012-05-28T08:21:35.500 回答