我很难适应C++处理动态和自动内存的方式。我的问题:

  • 即使已经保留了实例化的范围,指向自动分配的实例的指针也可以使保留释放的实例吗?
    this帖子中,我读到所有指向dealloc内存的指针均无效。但是这个家伙是在谈论手动取消分配还是自动取消分配后的行为?

  • 这是一个例子:
    int main(){
       UiTreeRecord child = UiTreeRecord::UiTreeRecord();
       createSomeScope(child);
       //Does child still have a valid parent?
       //Or does parent point to a piece of memory that has been deallocated?
    }
    
    void createSomeScope(const UiTreeRecord& child){
       UiTreeRecord root = UiTreeRecord::UiTreeRecord();
       child.attachParent(root);
    }
    
    void UiTreeRecord::attachParent(UiTreeRecord& newParent) {
        if(parent != nullptr) {
            detachParent();
        }
        parent = &newParent;
    }
    

    最佳答案



    当变量超出范围时。或在自动成员变量的情况下,拥有对象被破坏时。



    不,不能。指针只是一直指向现在无效的内存。无论对象被销毁的方式如何,指向被销毁对象的指针和引用总是无效的-无论是自动,动态还是静态释放。

    在您的示例中,root被释放在createSomeScope的末尾,并且您在UiTreeRecord::attachParent中分配的指针变为无效。

    10-08 07:33