堆栈变量超出范围时是否解除分配?
Is the stack variable deallocated when it goes out of scope?
sample1.cpp
#include <iostream>
int main()
{
int* aPtr = nullptr;
{
int a = 3;
aPtr = &a;
}
std::cout << *aPtr << std::endl;
return 0;
}
输出
3
我能够通过aPtr
访问a
。
- 这是否意味着
a
即使在它退出后也不会被释放 范围。 - 这是否意味着
a
仅在函数之后才被释放 它的定义是展开的。 - 或者这是当前输出某些值的未定义行为?
桑佩2.cpp
#include <iostream>
struct Box
{
Box(int a_)
:a(a_)
{}
int getValue() const { return a;}
~Box()
{
std::cout << "Destructor called" << std::endl;
}
private:
int a;
};
int main()
{
Box* boxPtr = nullptr;
{
Box box = 23;
boxPtr = &box;
}
std::cout << boxPtr->getValue() << std::endl;
return 0;
}
输出
Destructor called
23
即使在调用box
的析构函数之后,我也能够通过boxPtr
访问box
。
正如评论中提到的,在这两种情况下,您都面临着未定义的行为(因此允许发生任何事情(。堆栈变量一旦超出范围就会被销毁,它们占用的内存被释放,尽管通常它不会立即被覆盖(至少在上面这样的简单情况下(,因此指向此类变量的指针有时可能会表现出或多或少的"有效"属性(就像看起来对象仍然有效(, 尽管它明显悬而未决。
相关文章:
- 我在二维向量中是否正确分配了内存
- 指针会被解除分配吗?
- 基于浅树的数据结构的内存分配器,用于频繁分配和解除分配
- 解除分配矩形 2D 数组会根据尺寸产生错误
- 为什么在正确解除分配内存时出现内存泄漏?
- 堆栈变量超出范围时是否解除分配?
- 如何在不使用 "new" 关键字的情况下解除分配创建的对象的内存?
- 在 QStandardItemModel 中解除分配项目
- 解除分配此特定 2D 阵列的内存
- C++删除数组只会解除分配第一项
- 下标是否在分配运算符的右侧进行评估
- 如何确定对象是否已分配成员
- 是否随作用域分配和解除分配堆栈帧
- 如果清除了 std::map 是否确保内存被解除分配
- 是否需要解除分配本地时间的内存
- 抛出异常后,对象内分配的指针是否自动解除分配
- 是否有比 boost::object_pool 更快的 C++ 堆分配/解除分配机制
- 析构函数是否自动为成员变量解除分配堆内存
- 如何验证一个节点在C++链表中是否已解除分配
- 是否需要string.c_str()解除分配