关于new和delete的问题求教
#include<iostream>
using namespace std;
class U_Ptr{
friend class HasPtr;
int *ip;
size_t use;
U_Ptr(int*p):ip(p),use(1) {}
~U_Ptr()
{
cout<<"delete U_Ptr"<<endl;
delete ip;
}
};
class HasPtr{
public:
HasPtr(int*p,int i):ptr(new U_Ptr(p)),val(i){};
HasPtr(const HasPtr&orig):ptr(orig.ptr),val(orig.val)
{
++ptr->use;
cout<<ptr->use<<endl;
}
HasPtr&operator=(const HasPtr&);
~HasPtr()
{
if(--ptr->use==0)
{
delete ptr;
}
cout<<"delete ptr "<<ptr->use<<endl;
}
private:
U_Ptr *ptr;
int val;
};
HasPtr&HasPtr::operator=(const HasPtr &rhs)
{
++rhs.ptr->use;
if(--ptr->use==0)
delete ptr;
ptr=rhs.ptr;
val=rhs.val;
return *this;
}
int main()
{
int obj;
HasPtr p1(&obj,42);
std::cout<<"********************************"<<std::endl;
HasPtr p2(p1);
std::cout<<"********************************"<<std::endl;
HasPtr p3(p1);
std::cout<<"********************************"<<std::endl;
return 0;
}
这段代码在输出最后一行星号之后出错。
按以下两种方式修改后,程序都能正常运行
1.U_Ptr(int*p):ip(p),use(1) {}
改为U_Ptr(int*p):ip(new int(*p)),use(1) {}
2.~U_Ptr()
{
cout<<"delete U_Ptr"<<endl;
delete ip;
}
改为~U_Ptr()
{
cout<<"delete U_Ptr"<<endl;
}
这两种改法,是否意味着new和delete必须成对出现?
还有,第二种改法,ip指针在析构的时候是否会被删除?
求解!
谢谢!
...全文
相关推荐
new,delete和指针
在使用new和delete时,我们需要注意一些问题。例如,在使用new申请内存空间时,我们需要手动释放内存空间,以免造成内存泄露。
C++动态内存分配(new/new[]和delete/delete[])详解
为了解决这个问题,C++提供了new和delete运算符来动态分配内存。new运算符可以在堆上创建对象,并调用构造函数来初始化对象。delete运算符可以释放对象所占用的内存。
C++中new和delete的介绍
同时,我们也提醒读者在使用new和delete时一定要遵循正确的使用原则,以避免内存泄露和其他问题。
C++ new、delete(new[]、delete[])操作符重载需要注意的问题
这意味着基类的`operator new[]`不会被子类的实例调用,而`delete[]`会调用子类的析构函数,但使用基类的`operator delete[]`。5.
C++中new和delete的使用方法详解
C++中的`new`和`delete`是两个重要的关键字,它们分别用于动态内存分配和释放。这些运算符允许程序员在程序运行过程中根据需要创建和销毁数据对象,从而实现灵活的数据管理。**new运算符的


