再写哈夫曼树实现的时候,用了标准库优先级队列来存储,更新结点,但是直接存储节点对象还是存储指针呢,本来我习惯于存储指针感觉指针很好用,也很灵活。但就是想试试直接存储节点,于是很自然地分配了局部对象,然后加到队列里,然后在分配了局部对象,加到队列里,运行程序,怎么搞都不对,后来去网上求助,才明白在一个循环里分配局部对象的每次都是一样的,自己以为每次都分配了不同的内存空间,实际每次操作的都是同一个片内存。
测试代码:
#include<iostream>
using namespace std;
class test{
public:
int a;
};
int main(){
for(int i=0;i!=10;++i){
test t;
cout<<&t<<endl;
}
return 0;
}
运行结果:
但是如果用new:
#include<iostream>
using namespace std;
class test{
public:
int a;
};
int main(){
for(int i=0;i!=10;++i){
test *t=new test;
cout<<t<<endl;
}
return 0;
}
运行结果:
每次都是变的,。
所以有时候在程序中要新建点的时候最好还是用new 来分配。说来惭愧,虽然我知道这个但是我却不知道这个属于哪一块知识,貌似CSAPP上有,最近要看的东西太多,暂时搁下了,过段时间再看。。。