smart-pointers相关内容
class A : boost::noncopyable{ }; class B{ A & conn() const; }; 我该如何声明和实现conn()呢: conn应创建并返回对A类型对象的引用。 我不能使用B在客户端代码中中断B的接口 我想防止代码泄漏内存,所以我不能简单地返回 对堆中对象的引用。 我没有找到任何不会破坏客户端代码的智能指针实现,因为没有转换为
..
TLDR 为什么t_ptr = std::unique_ptr(t_ptr.get());行导致调用析构函数? 该行似乎只是无意地将t_ptr分配回它自己... 此外,为什么我能够在假定的销毁之后继续调用方法? 示例代码 class Test { public: Test() { printf
..
我正在寻找类似于Arc/Rc的智能指针,只是它不允许共享所有权。 我希望拥有所需数量的rc::Weak引用,但我只需要一个强引用,即所有者。我想用类型系统来强制执行这一点。 Arc/Rc可以克隆,并且可以在多个位置拥有它们。 卷起我自己的智能指针将是一种选择,但我相信这样的数据结构应该已经存在,即使在标准库之外。 我正在寻找提供这种接口的数据结构: impl MySm
..
一般问题 现在我读了很多关于智能指针的文章,在很多情况下,共享指针似乎是“完美的”。然而,我也读到了周期性引用或类似的东西?哪里不能使用shared_ptr?我很难理解这一点,有谁能举一个简单的例子来说明这一点吗? 我真的想知道,弱_ptr提供了什么普通指针不能提供的?-因为它们不增加引用计数,所以它们不能保证它们所指向的内存仍然有效? 我的个人项目: 在一个项目中,我有两个“全局
..
我有以下代码: unsigned char* frame_buffer_data{ new unsigned char[data_size] }; glReadPixels(origin_x, origin_y, width, height, GL_BGR, GL_UNSIGNED_BYTE, frame_buffer_data); 我要删除原始指针(frame_buffer_data)
..
到目前为止,我已经为一些数据处理分配了缓冲区,然后将其删除。由于代码变得更大,并且在某些情况下可能会发生异常,我考虑使用std::unique_ptr使其更安全,并提出了这些解决方案: unique_ptr p1( (char*)operator new(bufSize), operator delete); unique_ptr
..
我想知道为什么Make_Unique调用复制构造函数而不调用默认构造函数。 Node() { std::cout
..
我有两个结构: struct A { map: HashMap>, } struct B { weak: Weak } 当构造A时,它将拥有几个B,每个都链接到刚刚构造的A,类似于: let a = Arc::new(A { map: HashMap::new() }); let b1 = B { weak: Arc::downg
..
我想使用智能指针实现一个简单的引用计数。变量pointer表示指向存储对象的指针,reference_count表示对象副本的总数。 如果我们使用NULL初始化对象:Reference_count=-1否则Reference_Count=1 COPY CTOR AND OPERATOR=INCREMENT REFERENCE_COUNT 析构函数递减Reference_count,如果没
..
我有一个unique_ptr的集合。这里我想获取其中的一些并将它们返回给调用者。调用者只需要读取内容,所以我想使用常量引用。但我不确定如何使用unique_ptr%s执行此操作。 以下是我使用原始指针执行此操作的一些代码: class entry { }; vector master; const vector get_entries() {
..
似乎有两种方法可以临时获取weak_ptr指向的资源的所有权: 使用lock() 将weak_ptr传递给shared_ptr构造函数 这两个函数都产生shared_ptr,在weak_ptr为空的情况下,锁返回nullptr,shared_ptr构造函数抛出异常。 因此,问题是:应该在什么时候使用其中之一?是否有与此相关的一般指导原则或最佳实践? 推荐答案 复制自ht
..
我有一个函数,用于分配给定大小的缓冲区。缓冲区将在返回之前对一些数据进行预处理/填充。此预处理可能返回FALSE,以表示此缓冲区未正确处理。因此,我要对此缓冲区应用RAII,以避免在没有delete[]它的情况下提前返回。 通常我使用unique_ptr来帮助我自动释放本地分配的对象。在这种情况下,我需要返回这个分配的对象(归unique_ptr所有),并将所有权转移给调用者。但编译器抱怨说
..
首先,由于存在不同类型的智能指针,我想将这个问题集中在其中的两个上:引用计数的侵入式和非侵入式智能指针。针对每种指针类型分别询问该问题。 我真的不确定如何表达我的问题,所以我不是在问: 我不是在问为什么或什么时候需要聪明的指针。我也不应该使用哪种类型的智能指针以及使用这些指针的目的。 以下是我要问的问题,我希望它足够清楚:当处理“智能管理”对象时,我应该在哪些上下文中使用哪些指针语义?即智
..
与普通指针相比,使用自动指针(AUTO_PTR)有哪些优点和缺点?我听说它可以自动释放内存,但为什么不经常使用呢? 推荐答案 std::auto_ptr的主要缺点是它具有过户语义。这使得std::auto_ptr无法存储在STL容器中,因为这些容器在您存储或获取元素时使用复制构造函数。 此外,我注意到std::auto_ptr的另一个重要方面是它们不能用于PIMPL习语的使用。这是因
..
(假设我正在使用的库或框架需要使用原始指针) 使用拥有某些数据的智能指针,然后将取消引用的智能指针的地址传递给需要原始指针的函数是否有效? 推荐答案 是的,这是有效的做法。std智能指针具有专门用于get()成员函数。 通常,当您通过智能指针管理对象时,当这些函数暗示所有权语义时,您应该只将整个智能指针对象按原样传递给其他函数:如果函数将复制std::shared_ptr,则它
..
通过SHARED_PTR,您可以使用自定义删除器,如: auto fp = shared_ptr( fopen("file.txt", "rt"), &fclose ); fprintf( fp.get(), "hello " ); 并且无论函数如何退出,它都会记住fclose文件。 但是,重新计算局部变量似乎有点过分,所以我想使用unique_ptr: auto f
..
无法理解此操作失败的原因? int *p = new int(10); std::unique_ptr ptr(p); // Below line gives compilation error. std::cout
..
使用原始指针,我可以创建指针和Push_Back地址的矢量,如下所示: Entity objEntity; std::vector Entities; Entities.push_back(&objEntity); 如果我改用共享指针向量: std::vector> Entities; .如何推送地址? 据
..
似乎在C++20中,我们获得了一些用于智能指针的附加实用函数,包括: template unique_ptr make_unique_for_overwrite(); template unique_ptr make_unique_for_overwrite(size_t n); 和std::make_shared与std::shared_
..
如果我将智能指针(scoped_ptr、unique_ptr或shared_ptr)应用到具有自动存储持续时间(即存储在堆栈上)的对象上,会有问题吗?我假设不会像在两种情况下那样(有或没有智能指针),如果没有更多的指针指向它们,它们将被删除。指针本身始终具有自动存储持续时间,即,如果超出范围,它们将被删除。 推荐答案 是,有一个问题(一个很大的问题):您正在使用智能指针做一些它们不是设
..