c++ 析构函数
下面的代码,编译能通过,但是运行的话会输出很多东西,怀疑是析构函数出了问题。
但是想不明白为什么?以下是我的代码:
C++ 类 析构函数
#include <iostream>
using namespace std;
//class Screen;
class Screen{
};
class U_Ptr {
friend class ScreenPtr;
U_Ptr(Screen *p):ip(p){}
Screen *ip;
~U_Ptr() {delete ip;}//当把这行注释掉的话,运行就没有问题
};
class ScreenPtr {
public:
ScreenPtr(Screen *p):ptr(new U_Ptr(p)) {}
~ScreenPtr() {delete ptr;}
private:
U_Ptr *ptr;
};
int main()
{
Screen myScreen;
ScreenPtr sc(&myScreen);
return 0;
}
#include <iostream>
using namespace std;
//class Screen;
class Screen{
};
class U_Ptr {
friend class ScreenPtr;
U_Ptr(Screen *p):ip(p){}
Screen *ip;
~U_Ptr() {delete ip;}
};
class ScreenPtr {
public:
ScreenPtr(Screen *p):ptr(new U_Ptr(p)) {}
~ScreenPtr() {delete ptr;}
private:
U_Ptr *ptr;
};
int main()
{
Screen myScreen;
//ScreenPtr sc(&myScreen);
ScreenPtr sc(new Screen());
return 0;
}
int main()
{
Screen myScreen;
ScreenPtr sc(&myScreen); //这里 没有new 操作也进行了delete ip 操作阿!
//注释掉上面的 ,下面运行没有问题的!
ScreenPtr sc1(new Screen());
return 0;
}
那如果ScreenPtr sc(new Screen());和Screen myScreen;ScreenPtr sc(&myScreen);两者并存的话,程序该如何写呢?
class Screen{
};
class U_Ptr {
friend class ScreenPtr;
U_Ptr(Screen *p):ip(p){}
Screen *ip;
~U_Ptr() {delete ip;}
};
class ScreenPtr {
public:
ScreenPtr(Screen *p):ptr(new U_Ptr(new Screen(*p))) {} //拷贝一下
~ScreenPtr() {delete ptr;}
private:
U_Ptr *ptr;
};
int main()
{
//case 1
Screen myScreen;
ScreenPtr sc(&myScreen);
//case 2
Screen* p = new Screen();
ScreenPtr sc2(p);
delete p;
return 0;
}
class U_Ptr的构造函数没有new,析构函数中有delete,肯定不对。
class ScreenPtr的构造函数有new,析构函数有delete,正确。
class ScreenPtr缺少了拷贝构造以及赋值重载。这也是不正确的。
ScreenPtr类为什么需要拷贝构造和赋值重载?
不能用delete释放栈内存啊老兄
Screen* p = new Screen();这放入栈吗?
不能用delete释放栈内存啊老兄
Screen* p = new Screen();这放入栈吗?
class U_Ptr {
friend class ScreenPtr;
U_Ptr(Screen *p):ip(p){}
Screen *ip;
~U_Ptr() {delete ip;}//当把这行注释掉的话,运行就没有问题
};