从原始指针创建shared_ptr时基础资源的状态



这个关于共享指针的链接指出

您可以通过以下方式将shared_ptr传递给另一个函数:。。。将基础指针或引用传递到基础对象。这使被调用者能够使用对象,但不能共享所有权或延长生存期。如果被调用者从原始指针创建了一个shared_ptr,那么新的shared_ptr独立于原始指针,并且不控制底层资源。当调用者和被调用者之间的约定明确指定调用者保留shared_ptr生存期的所有权时,请使用此选项。

使用原始指针来显示使用make_sharednew初始化共享指针的更好实践的类似情况清楚地表明,如果从原始指针进行初始化,将导致资源删除两次。

我也在尝试运行以下代码:

void f(int* ptr)
{
shared_ptr<int> sptr(ptr);
cout << "sptr in f: " << sptr.get() << endl;
}
int main()
{
auto sp1 = make_shared<int>(1);
cout << "sp1 in main: " << sp1.get() << endl;
f(sp1.get());
return 0;
}

并得到以下错误。

sp1 in main: 0x6000016f5138
sptr in f: 0x6000016f5138
a.out(12083,0x119097600) malloc: *** error for object 0x6000016f5138: pointer being freed was not allocated
a.out(12083,0x119097600) malloc: *** set a breakpoint in malloc_error_break to debug
zsh: abort      ./a.out

我的问题是在给定的链接中意味着什么

如果被调用者从原始指针创建shared_ptr,则新的shared_ptr独立于原始指针,并且不控制底层资源。

当我的示例代码输出和上面类似的堆栈溢出后链接不是这种情况时。

这段话措辞怪异。如果你去掉这句话:

如果被调用者从原始指针创建shared_ptr,则新的shared_ptr独立于原始指针,并且不控制底层资源。

很好。事实上,在这种情况下,谈论如果被调用者创建一个新的shared_ptr会发生什么是不合理的。

这句话旨在警告而不是从作为参数传递的随机指针创建shared_ptr。新的CCD_ 6是";独立于原件;但句子的其余部分最好表述为";并且它们两者都将试图破坏底层资源";。与其说它没有";控制";它这是因为它没有正确地这样做。

最新更新