我有一个包含动态分配成员的类(仅在使用时才分配)。这样想:classA{};classB{A*aMember;};用什么替换A*会更好:std::optional或std::unique_ptr?以及何时使用std::optional而不是std::unique_ptr 最佳答案 std::optional保证不会发生辅助内存分配。这意味着A类型的潜在对象的原始缓冲区嵌入到std::optional.它是std::optional的组成部分的内存占用。这意味着std::optional的内存大小总是至少为sizeof(A),无论是否
我有一个问题,请看下面这个简单的C++程序,intmain(){shared_ptrsptr1(newint);shared_ptrsptr2=sptr1;shared_ptrsptr3;shared_ptrsptr4;sptr3=sptr2;cout输出:333444sptr1和sptr3对象如何知道引用计数在打印4时递增。据我所知,引用计数是每个shared_ptr对象中的一个变量。 最佳答案 Asfarasiknowreferencecountisavariableineachshared_ptrobject.不,引用计数存储
假设我有两个不相关类A和B。我还有一个类Bla使用boost::shared_ptr像这样:classBla{public:voidfoo(boost::shared_ptr);voidfoo(boost::shared_ptr);}注意const。这是这个问题的原始版本缺少的重要部分。这编译,下面的代码工作:Blabla;boost::shared_ptra;bla.foo(a);但是,如果我在上述示例中从使用boost::shared_ptr切换到使用std::shared_ptr,我会收到如下编译错误:"error:callofoverloaded'foo(std::shared
有什么地方可以确认吗?我不确定是GCC的问题还是我的代码的问题。例如,以下代码无法编译:#include#includeusingnamespacestd;intmain(){unordered_set>s;unique_ptrp(newint(0));s.insert(move(p));return0;}错误信息太大,我不想放在这里。GCC版本为4.5.3,编译标志为-std=gnu++0x。也在4.4.5上测试过。 最佳答案 GCC4.6.1按原样接受您的代码,我认为它没有任何问题(即关联容器的value_type必须是Empl
我是C++11的新手,现在正在努力通过避免直接使用指针来提高我的C++技能。我正在尝试编写一个Sprite管理器来跟踪以前加载的Sprite并释放未使用的Sprite。我正在尝试为此使用shared_ptr(指向位图的指针),但管理器还必须保留一个shared_ptr来创建Sprite-所以引用计数不会下降到0。我能以某种方式声明“父”shared_ptr在我的经理中没有所有权,所以它不算作引用(并且仍然创建该shared_ptr的所有权拷贝)? 最佳答案 使用weak_ptr.那会解决你的问题。您不需要释放它们,因为它们会自动释放
我刚刚开始使用C++boost库。我在很多地方读到,当使用scoped_ptr时,即使出现异常,对象也总是被销毁。Theybehavemuchlikebuilt-inC++pointersexceptthattheyautomaticallydeletetheobjectpointedtoattheappropriatetime.Smartpointersareparticularlyusefulinthefaceofexceptionsastheyensureproperdestructionofdynamicallyallocatedobjects.我尝试了以下代码。#includ
我不确定我是因为文档错误还是更头疼,所以...我想做的是创建一个与另一个共享所有权的shared_ptr,但它引用对象的一个成员而不是整个对象。简单的例子,起点...structs{inta,b;};shared_ptrs1(news);//pointingtowholeobject来自en.cppreference.com,shared_ptr的构造函数(8)是...templateshared_ptr(constshared_ptr&r,T*ptr);描述中提到“构造一个与r共享所有权信息的shared_ptr,但持有一个不相关且非托管的指针ptr...例如在ptr是r管理的对
考虑以下代码:std::auto_ptrp;if(p.get()==0){...}get()成员函数是否是检查p是否未初始化的标准且可靠的方法?无论平台、编译器、编译器的优化标志等如何,它总是返回0吗? 最佳答案 不存在未未初始化的std::auto_ptr,defaultconstructor将指针初始化为0:explicitauto_ptr(X*p=0);因此get()将在默认构造的std::auto_ptr上有效地返回“0”。 关于c++-未初始化auto_ptr时get()是否可
我无法创建:shared_ptrn_char=make_shared(newchar[size_]{});如何创建char*chr=newchar[size_]{};使用现代指针? 最佳答案 shared_ptrn_char=make_shared(newchar[size_]{});make_shared在内部调用new,因此您永远不会同时使用两者。在这种情况下,您只需调用new,因为make_shared不适用于数组。但是,你仍然需要让它调用正确的删除:C++17之前:您需要明确指定删除器。std::shared_ptrptr(
(是的,我知道一条机器指令通常并不重要。我问这个问题是因为我想了解pimpl惯用语,并以最好的方式使用它;而且因为有时我会这样做关心一条机器指令。)在下面的示例代码中,有两个类,Thing和其他。用户将包括“thing.hh”。Thing使用pimpl习语来隐藏它的实现。OtherThing使用C风格——返回和获取的非成员函数指针。这种风格产生稍微好一点的机器代码。我是想知道:有没有办法使用C++风格——即创建函数成成员函数——但仍然保存机器指令。我喜欢这种风格,因为它不会污染类外的命名空间。注意:我只关注调用成员函数(在本例中为calc)。我不是在看对象分配。以下是我Mac上的文件、