gpt4 book ai didi

c++ - 智能指针实现 : when is the destructor invoked for pointee?

转载 作者:太空宇宙 更新时间:2023-11-04 15:06:10 27 4
gpt4 key购买 nike

我有下面的代码,并用智能指针包装了 Temple 对象。我明白了这个概念,但我不明白的是何时调用持有对象的析构函数。

想不到,我还没有实现~mySmartPointer,调用了模板析构函数。

输出

Temple Constructor

Invoking pointer access operator

-- Welcome Temple

Invoking De-referencing Operator

-- Welcome Temple

Temple Destructor

Destructor is Invoked

代码

#include <iostream>
using namespace std;

template <typename T>
class mySmartPointer
{
private:
T *_object;
public:
explicit mySmartPointer(T * newObject) {
_object = newObject;
};
~mySmartPointer() { cout <<"Destructor is Invoked "<<endl;};

T operator *() {
cout <<" Invoking De-referencing Operator "<<endl;
return * _object;
};

T * operator ->() {
cout <<"Invoking pointer access operator "<<endl;
return _object;
};
};

class Temple
{
private:
int x,y;
public:
void printWelcome() {
cout <<"-- Welcome Temple "<<endl;
}
Temple() {
cout <<"Temple Constructor"<<endl;
}
~Temple() {
cout <<"Temple Destructor "<<endl;
}
};

int main(int argc, char ** argv) {
mySmartPointer<Temple> t (new Temple);
t->printWelcome();
(*t).printWelcome();
}

最佳答案

这个

T operator *() 

按值返回 - 被销毁的是那个拷贝。

如果你把它改成

T& operator *() 

您会看到调用的对象没有析构函数。请注意,这应该有两个版本:

T const& operator *() const;
T& operator *()

operator-> 类似。这样您就可以在 const 对象上调用 const 方法。

如果您这样做是出于教育目的,那很好,否则请使用现有的实现之一。

关于c++ - 智能指针实现 : when is the destructor invoked for pointee?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14505166/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com