- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,我正在尝试加深对 shared_ptr 的理解,如果多个共享 ptr 指向同一资源共享指针,则可以处理在销毁指向资源的最后一个指针之前不应调用 destrcutor 的情况。
这是我的示例代码:
#include <iostream>
#include <memory>
class A {
public:
A(int num) {
std::cout << "cons A\n";
}
~A() {
std::cout << "dis A\n";
}
};
int main() {
std::shared_ptr<A> ptr(new A(12));
{
std::cout << "Inside Scope \n";
std::shared_ptr<A> ptr1 = ptr;
std::cout << "Outside Scope \n";
}
std::shared_ptr<A> ptr2(ptr.get());
std::cout << ptr << std::endl;
}
抛出异常的输出如下所示
cons A
Inside Scope
Outside Scope
dis A
dis A
free(): double free detected in tcache 2
任何人都可以解释这种行为还是我误读了什么?提前致谢。
最佳答案
问题出在你的线路上
std::shared_ptr<A> ptr2(ptr.get());
这不是共享指针的使用方式。相反,用类似的东西替换它
std::shared_ptr<A> ptr2{ptr};
或
std::shared_ptr<A> ptr2 = ptr;
(此外,正如 Den-Jason 在评论中指出的那样,您应该更喜欢使用 std::make_shared
。)
当您将裸指针传递给 ptr2
时,它无法“知道”另一个共享指针(在本例中为 ptr
)正在处理它。它“认为”你正在传递你刚刚分配的东西。因此,它们都尝试释放同一个指针,导致您观察到的“双重释放”错误。
一旦共享指针管理了一个资源,你应该尽可能避免与裸指针打交道,绝对不要将它传递给另一个。
关于c++ - Shared_pointer 显示出与我在教科书中读到的行为不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65505629/
因此,我正在尝试加深对 shared_ptr 的理解,如果多个共享 ptr 指向同一资源共享指针,则可以处理在销毁指向资源的最后一个指针之前不应调用 destrcutor 的情况。 这是我的示例代码:
有一段代码: A.cpp class MySomeClass: public SomeClass { public: void specificMethod(); } class A {
我有一个基本多态类(带有虚方法)和一个派生类。我正在尝试使用以下代码 boost::shared_ptr ptr( new derived_class() ); 但是编译器返回如下错误
我有一个派生自 std::enable_shared_from_this 的类。所有类对象都由共享指针管理,因此当没有更多共享指针指向它们时,它们会自动销毁。 我有一个类方法,它从程序的数据结构中删除
我有一个由 Node 和 Edge 类表示的有向图模型。每个 Node 对象都包含指向其所有传出和传入边的指针,每个 Edge 对象都包含指向其起点和终点(Node 对象)的指针。 class Mod
我正在尝试将派生类作为 std::shared_pointer 传递给一个函数,该函数的参数是具有模板的基类。 这是一个完整的例子: template class Base { public:
我使用 reset() 作为我的 shared_pointer 的默认值(相当于 NULL)。 但是如何检查 shared_pointer 是否为 NULL? 这会返回正确的值吗? boost::sh
我正在使用一个程序,其中我的代码调用第三方库,该库使用 boost 和 shared_pointers 来创建一个大而复杂的结构。这个结构是在我调用的方法中创建的,在方法结束时我知道程序已经完成。 对
我有一个函数返回类型为 const A 的共享指针。 std::shared_ptr getPointer() const; 我有一个函数需要 A 类型的 shared_ptr。 void foo(s
我正在尝试使用 tr1 的 shared_ptr 和 Qt 4.8.2 但我遇到了一些麻烦。这是我的代码: #include "mainwindow.h" #include "ui_mainwindo
我一直在尝试从 map 中填充 vector 。我知道如何以更传统的方式做到这一点,但我试图用 STL 算法(一个衬里)来实现它作为某种训练:)。 原始 map 类型是: std::map > 目标
我有以下问题,我想知道是否有更好的方法来解决它: class myObj { public: typedef std::shared_ptr handle; typedef std::
我基本上是这样设置的: class B { /* ... */}; class C1 : public B { /* ... */}; class C2 : public B { /* ... */}
我是一名优秀的程序员,十分优秀!