一个关于函数参数引述的疑问

一个关于函数参数引用的疑问
刚开始我问了个问题,http://bbs.****.net/topics/390876262?page=1#post-398111538,在这里感谢大家让我了解了拷贝函数的使用。
但是又出现了一个新问题,这里另开一贴。
为了方便阅读,先把代码贴上:

#include <iostream>

using namespace std;
class test{
public:
int *p;
test(int value){
p = new int(value);
}
~test(){
delete p;
p = NULL;
}

test(const test &other){
p = new int(*other.p);
}

test & operator = (const test &pt){
if( this == &pt ) return *this;
delete p;
p = new int(*pt.p);
return *this;
}

bool operator == (const test &other){
return p == other.p;
}

friend ostream & operator << ( ostream &os, test &A ){
os << *A.p;
return os;
}
void printvalue(){
cout<<"the value is "<<*p<<endl;
}
};

void func(test t){
cout<<"in the func value is "<< t <<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
test t1 = 33;
func(t1);
t1.printvalue();
system("pause");
return 0;
}


我的问题是func函数参数的使用。
1、如果该参数不加引用(void func(test t)),那么调用该函数时相当于产生了一个test对象,当退出该函数后会进行test的析构操作。问题是,我传入t1,那么t和t1应该是指向同一块内存的,对t进行析构时,t1指向的内存应该也同时被删除了。但是调试时发现并未如此,执行完func(t1)后,再次执行打印t1.printvalue()操作,发现值仍为33,说明t1指向的内存并未被删除。
2、如果该参数加了引用(void func(test &t))。那么此时的参数t传入的是t1的地址,在执行完func函数后,不会执行析构操作。
对于以上两点现象,因为我对指针不怎么了解,所以对这里感觉很疑惑,希望大侠帮忙解答下,谢谢!
------解决方案--------------------
1)你写了正确的拷贝构造函数,所以没有发生问题
2)编译器底层就是用指针实现引用的
------解决方案--------------------
我只回答你的问题1,delete一块内存,只是告诉系统,这块内存还给你了,但是内存的内容不一定会被清空。只要系统不用,里面的值就不会变。你依然可以用指向这块内存的指针访问,但有可能会出错。
------解决方案--------------------
要下班了,晚上有事。看你这么认真,晚上回来详细给你讲下引用和你说的问题。
------解决方案--------------------
当你按传递的时候,即void func(test t),形参是实参的拷贝,即会调用拷贝构造函数将 t1 拷贝给 t ,改变 t 的值并不会影响外部 t1 的值。

而当你传递引用的时候,即void func(test& t),t 相当于是实参 t1 的“别名”,对 t 的操作其实就是对 t1 的操作。
在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
------解决方案--------------------
引用:
是我看错了。。。不加引用时参数 t 指针值与 t1 并不相同。这里我弱弱的问句,指针值相同的话,是不是指向的地址(地址是不是内存块?)是一样的?

指针值相同,代表指向同一块内存地址,也就是内存块,在同一时间是一样的
------解决方案--------------------
呵呵,可能是你对我上篇帖子说的有点误解。t = t1 ,t和t1是不同的对象,怎么可能会指向同一块内存。没重新定义复制构造函数前,默认复制构造函数执行时会执行:t.p = t1.p,所以t.p和t1.p指向同一块内存。如果你能看懂下面的代码存在的问题,就应该理解了。
 int *p = new int(5);
    int *p1 = p;
    delete p;
    cout<<*p1<<endl;//不会输出5
  
但你重新定义了复制构造函数后,相当于下面的代码:
 int *p = new int(5);
    int *p1 = new int(*p);
    delete p;
    cout<<*p1<<endl;//输出5

------解决方案--------------------
楼主我重新构成了你的代码,这下配合输出你应该能明白了
代码如下:
using namespace std;

class test{
int *p;
public:
test(int value){
p = new int(value);
cout<<"Execute Constructor"<<endl;
cout<<"p的地址为"<<&p<<"前p的值为"<<p <<" *p的值为"<<*p<<endl;
}
~test(){
cout<<"Execute Destructor"<<endl;
delete p;
p = NULL;
}

test(const test &other){
cout<<"Execute Copy Constructor"<<endl;
p = new int(*other.p);
}

test & operator = (const test &pt){
cout<<"Test operator"<<endl;
cout<<"前p的地址为"<<&p<<"前p的值为"<<p <<" *p的值为"<<*p<<endl;
p = new int(*pt.p);
cout<<"前p的地址为"<<&p<<"后p的值为"<<p <<" *p的值为"<<*p<<endl;
return *this;
}

bool operator == (const test &other){
return p == other.p;
}

friend ostream & operator << ( ostream &os, test &A ){
os << *A.p;
return os;
}
void printvalue(){
cout<<"the value is "<<*p<<endl;
}
};

void func(test t){
cout<<"Waiting... "<<endl;
t.operator=(5);
cout<<"in the func value is "<< t <<endl;
}

int _tmain(int argc, _TCHAR* argv[])