gpt4 book ai didi

c++ - 自动添加和删除列表中的对象

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

我有课。实例化此类时,我希望将该实例添加到列表中。当对象被删除时,我希望它从列表中删除。

所以我给这个对象一个指向它自己的共享指针。然后我有一个指向那些共享指针的弱指针列表。当一个对象被创建时,它会创建一个指向自身的共享指针,创建一个指向它的弱指针,并将弱指针放入一个列表中。

当对象被销毁时,共享指针也是如此。每当我尝试访问列表中的成员时,我都会确保它没有过期并且它的使用计数不为 0。尽管如此,当列表成员被销毁时我仍然会崩溃。为什么?我可以绕过它吗?这是我的 SSCCE:

#include <iostream>
#include <memory>
#include <vector>

class test
{
private:
std::shared_ptr<test> self;

public:
int val;
test(int set);

test(test &copy) = delete; // making sure there weren't issues
// with a wrong instance being deleted
};

std::vector<std::weak_ptr<test>> tests;

test::test(int set):
val(set)
{
this->self = std::shared_ptr<test>(this);

tests.push_back(std::weak_ptr<test>(this->self));
}

void printTests()
{
for (auto i = tests.begin(); i != tests.end(); i++)
{
if (i->use_count() == 0 || i->expired())
{
tests.erase(i);
continue;
}

std::cout << i->lock()->val << std::endl;
}

std::cout << std::endl;
}

int main(int argc, char **argv)
{
{
test t(3);

std::cout << "First tests printing: " << std::endl;

printTests();
} // SEGFAULTS HERE

std::cout << "Second tests printing: " << std::endl;
printTests();

return 0;
}

这个程序的输出如下:

First tests printing:
3

Segmentation fault (core dumped)

最佳答案

您的问题在于您如何创建自指针:

 this->self = std::shared_ptr<test>(this);

根据 documentation 使用此构造函数创建 shared_ptr 时,

When T is not an array type, constructs a shared_ptr that owns the pointer p. ... p must be a pointer to an object that was allocated via a C++ new expression or be 0

所以问题是 shared_ptr 正在获取您的堆栈对象的所有权,因此当对象被破坏时(以及 shared_ptr 以及它), shared_ptr 正在尝试删除 您在堆栈上的对象。这是无效的。

对于您的用例,如果您希望 test 比您的 vector 更长寿,那么您可以只存储 this

关于c++ - 自动添加和删除列表中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14948262/

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