奇了个怪,实施这个语句块后难道没有释放对象~
奇了个怪,执行这个语句块后难道没有释放对象~~~
代码如下:
本来以我的理解,执行ptr = &a后跳出语句块,a对象会被释放掉,即ptr成为一个野指针,当程序执行ptr->fun()中的aa = 5时会出现内存访问错误,但是实际上没有,程序照常运行,而且ptr->aa成功赋值为5~~~
另外调试时发现,跳出语句块后,aa值还是为7,好像跳出语句块后a对象并没有被释放~~
期待高人回答~~~~
------解决方案--------------------
指针指向无效对象
你这里是未定行为
结果不可靠
意思就是
可以看起来没问题
也可以出现类似 修改其他对象 程序崩溃 的错误
看编译器喜欢怎么做
------解决方案--------------------
作用域只是 C++ 中的概念.
栈其实一直都是那个栈, 不存在分配释放的问题, 只是把栈用于哪个变量.
即使在函数退出后, 它局部变量的内存仍然有效, 只是编译器随时会把它用作其他用途. 你继续使用的话行为未定义. 未定义不代表出错.
------解决方案--------------------
你这几行代码、编译器优化后最多使用2,3个寄存器 寄存器的值没变动。继续使用当然可行.只是在逻辑或者内存起伏比较大的情况下(后续情况肯定就会错了)
{
}
中的东西的作用域于肯定是在{}中,这点你不用怀疑
代码如下:
#include<iostream>
using namespace std;
class A
{
public:
int aa;
A():aa(7) {}
void fun()
{
cout << "fun of class A" << endl;
aa = 5;
}
};
int main()
{
A* ptr = NULL;
{
A a;
ptr = &a;
}
ptr->fun();
return 0;
}
本来以我的理解,执行ptr = &a后跳出语句块,a对象会被释放掉,即ptr成为一个野指针,当程序执行ptr->fun()中的aa = 5时会出现内存访问错误,但是实际上没有,程序照常运行,而且ptr->aa成功赋值为5~~~
另外调试时发现,跳出语句块后,aa值还是为7,好像跳出语句块后a对象并没有被释放~~
期待高人回答~~~~
对象
调试
内存
c++
------解决方案--------------------
指针指向无效对象
你这里是未定行为
结果不可靠
意思就是
可以看起来没问题
也可以出现类似 修改其他对象 程序崩溃 的错误
看编译器喜欢怎么做
------解决方案--------------------
作用域只是 C++ 中的概念.
栈其实一直都是那个栈, 不存在分配释放的问题, 只是把栈用于哪个变量.
即使在函数退出后, 它局部变量的内存仍然有效, 只是编译器随时会把它用作其他用途. 你继续使用的话行为未定义. 未定义不代表出错.
------解决方案--------------------
你这几行代码、编译器优化后最多使用2,3个寄存器 寄存器的值没变动。继续使用当然可行.只是在逻辑或者内存起伏比较大的情况下(后续情况肯定就会错了)
{
}
中的东西的作用域于肯定是在{}中,这点你不用怀疑