关于 C++ 中的智能指针的问题。

2025-04-25 09:44:54
推荐回答(2个)
回答1:

栈上开辟的能自动释放, 会自动调用 构造函数和析构函数、
堆上开辟的不能自动释放,需要手动delete。
例如
有个类 class Perosn的类,类里面有个成员m_Age,通过有参构造初始化。
堆上开辟 Person*p=new Perosn(10) 那么,这就在堆上开辟了,m_Age是10;
这样的话,到最后,一定要手动 delete p; 需要手动释放。
为了避免忘记释放,就要搞一个智能指针,代替 Person的指针p

再建立一个类比如 class smartPointer ,
把Person 中的指针p, 通过有参构造的方法传到 smartpointer里面
class smartPointer(Person*p)
{
this->p =p;
}
然后内部自己维护一个 成员变量名字叫
Perosn*p ,
然后再弄一个析构函数,
里面判断, if(p!=NULL)
{
delete p;
P->NULL;
}

这样就初步完成了智能指针, 仅仅解决了释放的问题。
通过栈的自动释放,把堆的里面顺便给释放了, 也就不需要手动释放了。
比如

smartPointer sp(new Person*p)
栈上开辟了一个sp, 传进来一个有参 ,(参数是堆上开辟的指针)
为了使 sp 能够像p 一个 ,调用Person类里面的 m_Age;
比如
p->m_Age ; (*p).m_Age; 正常可用
sp->m_Age ; (*sp).mAge; 报错,不过希望达到这样的效果
那么久需要在 smartpointer的类里面 重载 符号 -> 和 *
具体代码
Person* operator->()
{
return this->p;
}

Person & operator*()
{
retrun * this->p
}
这样,指针 sp 就能像p 一样使用了, 也不必考虑释放的问题。很方便。

回答2:

智能指针指向什么跟堆栈内存没有什么直接关系,只不过一般用于指向堆内存,因为栈内存在作用域结束的时候就释放了,没必要在用智能指针。
至于Debug Assertion Failed是指断言错误,出现了不该出现的错误,可能跟你代码里先销毁了i在销毁s的时候有关。