我正在阅读this链接中的教程。它清楚地说明了第二点是在通过它删除对象之后,删除后不应该访问被删除对象的任何成员。但是在删除对象输出后仍然是" x = 0 y = 0"。 这是我的代码:
#include<iostream>
using namespace std;
class Test
{
private:
int x;
int y;
public:
Test(int x = 0, int y = 0) { this->x = x; this->y = y; }
void setX(int a) { x = a; }
void setY(int b) { y = b; }
void destroy() { delete this; }
void print() { cout << "x = " << x << " y = " << y << endl; }
};
int main()
{
Test *obj;
obj = new Test;
obj->destroy();
obj->print();
return 0;
}
答案 0 :(得分:3)
这是未定义的行为。当您致电df %>% group_by(id) %>% mutate(tid = ifelse(is.na(lag(type)) | lag(type) == 'a' | (type == 'b' & lag(type) == 'a'), 1, 0))
时,以前分配给x
和y
的内存尚未被覆盖。一个好的做法是在删除后立即设置print()
。
答案 1 :(得分:0)
正如Carlton所说,内存未被覆盖,您可以尝试以下代码:
int main()
{
Test *obj;
obj = new Test;
obj->destroy();
Test *another_obj = new Test(7, 8);
obj->print();
return 0;
}
在我的机器上打印x = 7 y = 8
,您可以使用代码。当您尝试在obj->destroy()
和obj->print()
重点是未定义的行为
修改强>
我调试了代码以更清楚地说明它。你可以看到obj
的地址是0x100104aa0
,然后执行delete this
时内存没有改变,但是,没有改变不对你的程序来说意味着什么,这意味着内存0x100104aa0
free 可以使用(这里有一点,如果程序要写入(分配)一些内存,那么它就没有了如果内存初始化/清除与否则存在差异,因此为了提高效率,不会清除使用内存)
然后,当我初始化sss
时,它被分配到同一地址,并带有新的x
和y
值,请注意,在sss
初始化后,{{ 1}}仍然指向obj
,它恰好与0x100104aa0
的地址相同,这就是调用sss
为您提供obj()
的原因。
x = 7 y = 8