方法1:可以引用,但是是非法的,因为你delete的时候,其实操作系统就标记了一下这块内存已经释放,如果又有新的new,那他会被重新分配出去,而操作系统不会在delete的时候去把那个内存清零或者修改它,因为没必要,浪费时间。但是你这种写法的结果其实是不可预料的。因为,有可能你在调用f2->test1的时候,你的程序其他地方用了new,然后这块内存被分配了,这样这个程序会怎么走没人说得清。
方法2:依然是不正确的。因为你返回了局部变量的指针,这个局部变量会在函数返回之后被析构,也就会导致你那个指针指向的内存其实已经释放,后面的结果和方法1一样。
你说的不能用是指栈,函数结束,栈就被系统清了;堆空间不手动释放,对象是一直存在的。
一但编译后成员函数test1会被编译成这种形式
void test1(fish * f)
{
cout<<"this is aconstructor!"<
执行f2 -> test1();时相当于test1(f2); test1中
并没用到任何fish对象的东西,因此不管f2指向的对象在不在都会成功,即使这样都可以:
fish * fs;
fs -> test1();
方法2:同 Frank7258 的看法,而我的编译的时候就提示 warning C4172: returning address of local variable or temporary