C++自动内存: When is it deallocated?

标签 c++ memory-management scope

我很难适应 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;
}

最佳答案

automatic memory: When is it deallocated?

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

Can a pointer, that points to an automatic allocated instance, keep that instance from deallocation even after the scope of the instanciation has been left?

不,它不能。指针只是一直指向现在无效的内存。无论对象的销毁方式如何(自动、动态或静态释放),指向已销毁对象的指针和引用始终无效。

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

关于C++自动内存: When is it deallocated?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34484996/

相关文章:

c++ - 如何使用 alignof 强制对齐堆分配?

C++ - 从函数返回 vector

c++ - 在 QLabel 上将 12digit double 或 int 显示为 full 而不是 3.23223e+9

javascript - 这个解决方案是否正确处理 DOM 内存泄漏

c# - 当我们在 C# 中重新分配数组时,数组的值是否被破坏?

c++ - 如何限制构造生命周期更长的对象所需的变量范围?

c++ - 为什么不需要通过内联函数进行静态初始化

c# - GC 时间百分比高的原因是什么?对于我们在 APM perfmonitor 工具中的应用程序池,我们看到它超过 99% 并保持数小时

javascript - 如何使用多个 api 调用填充数组?

javascript - 变量在 for 循环中不可见