C ++自动内存:什么时候解除分配?

时间:2015-12-27 21:26:40

标签: c++ memory-management scope

我很难习惯C ++处理动态和自动记忆的方式。
我的问题:

  • 指向自动分配的实例的指针保持 实例是否可以解除分配,即使在实例化的范围之后仍然存在?
    /> this帖子中,我读到所有指向dealloc内存的指针都是无效的。
    但这个人是在谈论手动dealloc或自动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;
}

3 个答案:

答案 0 :(得分:1)

  

自动记忆:何时被解除分配?

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

  

指向自动分配的实例的指针是否可以在释放实例的范围后保留该实例的解除分配?

不,它不能。指针只是指向现在无效的内存。无论对象被破坏的方式如何,指针和对被破坏对象的引用都将变为无效 - 无论是自动,动态还是静态释放。

在您的示例中,root在[{1}}末尾取消分配,并且您在createSomeScope中指定的指针无效。

答案 1 :(得分:0)

做这样的事情是有潜在危险的。使用*或使用&,但不要使用引用的指针,因为引用可能会像您的情况一样失效。在您的示例中,您首先创建一个实例,然后将其作为对attachParent()的引用传递,然后将其转换为指针,但是当createSomeScope()返回时实例将被释放,因此您的指针变为无效。

答案 2 :(得分:0)

void createSomeScope(const UiTreeRecord& child){
  UiTreeRecord root = UiTreeRecord::UiTreeRecord();
  child.attachParent(root); 
}
在函数结束后,

root 立即无效,并且无法控制取消分配。记忆可能在不同的时间被释放"取决于代码优化等。