【发布时间】: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 成员) .所以这是另一种选择,假设它不是太大或共享为按值成员。但是,是的,一般来说,如果可以的话(使用值或引用)避免点数,并且一定要避免new和delete
标签: c++ destructor post-increment