【问题标题】:Class object deleting after post increment后增量后删除类对象
【发布时间】:2021-07-31 22:05:09
【问题描述】:

我有一个天气类。因此,假设我创建了该类的一个对象,比如说Weather object;,之后我创建了前后增量来控制天气的温度。因此,当我执行++object; 时,温度会完美增加一倍,但是当我执行object++; 时,会调用析构函数,我的指针被删除,然后我的温度变为随机数。我的问题是,为什么在世界上预先增加工作,但在增加后,析构函数被调用在那个对象上?这是我的 WORKING 预增量:

Weather &Weather::operator++() {
    ++ptr->airTemperature;
    return *this;
}

这是不工作的帖子增量:

Weather Weather::operator++(int) {
    Weather temp = *this;
    ++ptr->airTemperature;
    return temp;
}

据我了解,前置增量返回自身,后置增量返回一个副本,所以我这样做了,但可能导致问题的原因是什么?

【问题讨论】:

  • 您是否实现了复制构造函数来复制指向的值?默认的复制构造函数只是按位复制 - 它复制指针,而不是指针指向的内容。
  • 我猜在你的天气析构函数中你有delete ptr。对吗?
  • 在现代 c++ 中你不应该使用 delete,除非你真的需要。
  • 使用 std::shared_ptr 跟踪可能被多个对象拥有的指针。这样你就不必编写自定义的复制构造函数或析构函数了。
  • 也就是说,如果对象可以引用 same ptr。如果每个人都需要自己的指向数据副本并且可能需要不同的副本,那么您需要实现深层复制,并且可以通过搜索 SO 找到相关信息。但是到那时,您应该考虑一下为什么要使用指针:如果它可能只是一个按值成员,默认情况下您将获得深层副本(它的,不一定是 its 成员) .所以这是另一种选择,假设它不是太大或共享为按值成员。但是,是的,一般来说,如果可以的话(使用值或引用)避免点数,并且一定要避免 newdelete

标签: c++ destructor post-increment


【解决方案1】:

试试这样,你可以避免所有的拷贝构造函数和析构函数。

class Temp {
   double airTemperature;
};

class Weather {

    public:

    Weather(std::shared_ptr<Temp> tempPtr)
    : ptr(tempPtr){}

    std::shared_ptr<Temp> ptr;

    Weather Weather::operator++(int) {
        Weather temp = *this;
        ++ptr->airTemperature;
        return temp;
    }

    Weather &Weather::operator++() {
        ++ptr->airTemperature;
        return *this;
    }
};

当然要考虑你是否真的需要一个指向Temp的指针。也许你应该这样做。

class Weather {

    public:

    Weather(Temp temp)
    : temp(temp){}

    Temp ptr;

    Weather Weather::operator++(int) {
        Weather temp = *this;
        ++temp.airTemperature;
        return temp;
    }

    Weather &Weather::operator++() {
        ++temp.airTemperature;
        return *this;
    }
};

【讨论】:

  • 非常感谢!
猜你喜欢
  • 2019-07-13
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 2015-02-22
  • 2018-03-30
相关资源
最近更新 更多