gpt4 book ai didi

C++:创建共享对象而不是指向对象的共享指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:32:23 24 4
gpt4 key购买 nike

boost::shared_ptr 真的让我很困扰。当然,我明白这种东西的用处,但我希望我可以使用 shared_ptr<A> 作为 A* .考虑以下代码

class A
{
public:
A() {}
A(int x) {mX = x;}
virtual void setX(int x) {mX = x;}
virtual int getX() const {return mX;}
private:
int mX;
};


class HelpfulContainer
{
public:
//Don't worry, I'll manager the memory from here.
void eventHorizon(A*& a)
{
cout << "It's too late to save it now!" << endl;
delete a;
a = NULL;
}
};


int main()
{
HelpfulContainer helpfulContainer;

A* a1 = new A(1);
A* a2 = new A(*a1);
cout << "*a1 = " << *a1 << endl;
cout << "*a2 = " << *a2 << endl;
a2->setX(2);
cout << "*a1 = " << *a1 << endl;
cout << "*a2 = " << *a2 << endl;
cout << "Demonstrated here a2 is not connected to a1." << endl;

//hey, I wonder what this event horizon function is.
helpfulContainer.eventHorizon(a1);

cout << "*a1 = " << *a1 << endl;//Bad things happen when running this line.
}

创建 HelpfulContainer 的人并没有考虑其他人想要保留指向 A 对象的指针。我们不能给 HelpfulClass boost::shared_ptr 对象。但是我们可以做的一件事是使用 pimlp 习惯用法来创建一个本身就是 A 的 SharedA:

class SharedA : public A
{
public:
SharedA(A* a) : mImpl(a){}
virtual void setX(int x) {mImpl->setX(x);}
virtual int getX() const {return mImpl->getX();}
private:
boost::shared_ptr<A> mImpl;
};

然后主函数看起来像这样:

int main()
{
HelpfulContainer helpfulContainer;

A* sa1 = new SharedA(new A(1));
A* sa2 = new SharedA(sa1);
cout << "*sa1 = " << *sa1 << endl;
cout << "*sa2 = " << *sa2 << endl;
sa2->setX(2);
cout << "*sa1 = " << *sa1 << endl;
cout << "*sa2 = " << *sa2 << endl;
cout << "this demonstrates that sa2 is a shared version of sa1" << endl;

helpfulContainer.eventHorizon(sa1);
sa2->setX(3);
//cout << "*sa1 = " << *sa1 << endl;//Bad things would happen here
cout << "*sa2 = " << *sa2 << endl;
//but this line indicates that the originally created A is still safe and intact.
//only when we call sa2 goes out of scope will the A be deleted.
}

所以,我的问题是: 上面的模式是一个好的模式,还是有什么我还没有考虑的。我当前的项目继承了一个 HelpfulContainer像上面这样的类正在删除我需要的指针,但我仍然需要 HelpfulContainer 中存在的数据结构。


更新:这question是后续问题。

最佳答案

shared_ptr 的全部意义在于它(及其拷贝)拥有它指向的对象。如果您想为管理其生命周期的容器提供 A,那么您根本不应该使用 shared_ptr,因为它不能满足您的需求; HelpfulContainer 只知道如何成为动态创建对象的唯一所有者,因此您需要为它提供一个指向不属于任何其他对象的对象的指针。

我认为对象关心自己的生命周期是通常糟糕的设计(也有异常(exception))。如果一个对象可以完成一项工作并且其他东西管理它的创建和破坏,选择尽可能简单的生命周期策略(例如本地/自动变量),通常会更有用。

如果您绝对必须在两个不合作的事物(例如 shared_ptrHelpfulContainer)之间共享所有权,那么您将不得不使用某种代理技术。

不过,在这种情况下,看起来 HelpfulContainer 对您的情况没有太大帮助。

关于C++:创建共享对象而不是指向对象的共享指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4410790/

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