对象在删除后工作

时间:2015-08-05 17:48:34

标签: c++ this delete-operator

我正在阅读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;
}

2 个答案:

答案 0 :(得分:3)

这是未定义的行为。当您致电df %>% group_by(id) %>% mutate(tid = ifelse(is.na(lag(type)) | lag(type) == 'a' | (type == 'b' & lag(type) == 'a'), 1, 0)) 时,以前分配给xy的内存尚未被覆盖。一个好的做法是在删除后立即设置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时,它被分配到同一地址,并带有新的xy值,请注意,在sss初始化后,{{ 1}}仍然指向obj,它恰好与0x100104aa0的地址相同,这就是调用sss为您提供obj()的原因。

x = 7 y = 8