部分被摧毁的物体?

时间:2014-02-28 16:38:57

标签: c++ scope destructor

我试图了解破坏在这个简单的情况下是如何运作的:

class A {
public:
    A(int i) { this->b = i; }
    void p() { std::cout << a << " " << b << std::endl;}
private:
    string a = "42";
    int b = 0;
};

int main() {
    A* ap = nullptr;
    while (true) {
         A k(24);
         ap = &k;
         k.p();
         break;
    } // A out of scope, I expect any pointer to A to be invalidated.
ap->p(); // still callable, b has been freed but not a!?
}

ap怎么指向部分有效的对象?我做错了什么而不理解?请准确解释,因为我是c ++的新手。谢谢!

编辑:假设我在~A()中调用p();这样做是否安全?

3 个答案:

答案 0 :(得分:2)

C ++不是一种固有的引用计数语言,因此当对象被销毁时,指针不会以任何方式直接失效。你正在诱导未定义的行为,任何事情都可能发生。编译器不需要诊断此问题。

答案 1 :(得分:2)

  

ap怎么指向部分有效的对象?

ap不指向部分有效的对象。这是UB。代码有效,因为即使k超出范围,内存也不会改变。

这里发生的是,当k超出范围时,自由堆栈内存(将放置下一个堆栈对象的位置)的内存偏移量发生变化,因此k(k“为”的内存“)保持免费堆栈空间。将另一个对象放在堆栈上(在循环之后)可能会使ap。

中的地址处的内存无效

UB意味着任何事情都可能发生(在这种情况下,“任何东西”意味着ap指向的内存仍然指向A :: p函数的地址。

答案 2 :(得分:2)

您始终可以调用ap->p(),但如果您无法保证ap指向属于{的实例的有效内存位置,则您的程序将具有未定义的行为 {1}}。

未定义的行为意味着您的程序可以执行任何操作,包括崩溃,无所事事或执行任何其他操作。