【问题标题】:Pointer to an object still points to the first memory allocation [duplicate]指向对象的指针仍然指向第一个内存分配[重复]
【发布时间】:2016-10-12 02:37:32
【问题描述】:

鉴于此代码:

#include <iostream>

using namespace std;

class samp
{
    int i;
public:
    samp(int i)
    {
        this->i=i;
    }

    void show()
    {
        cout << "Sample" <<" "<<i <<endl;
    }
};

int main()
{
    samp* ptr ;
    for(int i=0;i<10;i++)
    {
        ptr = new samp(i);
        ptr->show();
        delete ptr;
    }
    ptr->show();
    return 0;
}

ptr 被定义为指向 10 个不同的 samp 类型对象。我知道删除它后,无法保证获得所需的输出。但是一次又一次地运行这个程序表明ptr仍然指向第一个对象,最后一个ptr-&gt;show()return语句之前的语句)给出:

Sample 0

但在循环的最后时刻,ptr 指向第 10 个对象,所以应该是最后一个 ptr-&gt;show()return statement 之前的语句)应该给出:

Sample 9

为什么它仍然给Sample 0而不是Sample 9

【问题讨论】:

  • 您试图推理未定义的行为。没有用。行为会随着编译标志、编译器、星期几等的变化而变化。
  • “我知道删除它后无法保证获得所需的输出”......那么,问题是什么?
  • 在这种情况下,i 可能会被归零,这让你认为最后一个show() 正在作用于第一个对象的内存,当它真的不是。如果show() 打印出其this 指针的值,您会看到最后一个show() 作用于最后一个对象的内存,而不是第一个对象。最后一个show() 打印i 的值是未定义行为,因为this 未指向有效对象,但打印this 本身的值不是未定义行为。

标签: c++ class pointers object dynamic-memory-allocation


【解决方案1】:

最后一个 ptr->show() (return 语句之前的语句)给出:

样本 0

这是因为您之前删除了指针,因此,正如您所说,无法保证获得所需的输出。你不应该使用最后一个 ptr->show()。

【讨论】:

  • 分配nullptr而不是删除?什么?
  • 在这种情况下它避免了意外的结果
  • 内存泄漏怎么办?
  • 程序结束时指针会被自动删除,所以对于这种情况来说确实没有任何问题。当您将来要使用该指针时使用nullptr 是一个好主意,而当您不再使用它时使用delete
  • "程序结束时指针会被自动删除,所以就本例而言确实没有问题。"这种说法是完全错误的。以及这是一个好主意。
猜你喜欢
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 1970-01-01
相关资源
最近更新 更多