草庐IT

shared_buffers

全部标签

c++ - 如何正确使用带有 boost const_buffers vector 的 boost async_write?

我在正确设置这一行时遇到了问题:boost::asio::async_write(serialPort,boost::asio::buffer(boost::asio::buffer_cast(vector_.front()),boost::asio::buffer_size(vector_.front())))vector_包含一些boost::asio::const_buffersstd::vectorvector_;这个东西有效,但我很确定有一种更优雅的方法可以做到这一点,如果没有,我想从有更多经验的人那里得到。那么,这个方案还能改进吗?如果是,怎么办?

c++ - 有没有我不会使用 std::make_shared 的情况?

根据我所做的研究,这听起来像std::make_shared是构建std::shared_ptr的首选方式。具体是因为:它只执行一次内存分配,而使用new则至少执行两次。如果传递给make_shared的ctor抛出异常,那么它就不会像new那样泄漏。我的问题是,假设我想要一个shared_ptr,我应该总是使用make_shared,还是在某些情况下首选new? 最佳答案 由于计数器和对象共享相同的分配,因此它们也共享相同的释放。计数器必须持续到最后一个shared_ptr和weak_ptr消失。如果您有一个大对象(或许多小对象)

c++ - std::function 和 shared_ptr

我使用Loki的Functor有一段时间了,最​​近我问了一个question关于它(仍然没有答案......)有人告诉我使用std::function,但我更喜欢Loki的Functor实现,因为它也可以使用各种指针作为参数(例如std::shared_ptr)。structToto{voidfoo(intparam){std::coutptr=std::make_shared();Loki::Functorfunc(ptr,&Toto::foo);func(1);}有没有办法用std::function做到这一点? 最佳答案 使

c++ - GLSL : Replace large uniform int array with buffer or texture

现在我正在尝试将一个整数数组传递到片段着色器中,并通过一个统一数组来实现:uniformintmyArray[300];并在着色器外用glUniform1iv填充它。不幸的是,大于~400的统一数组会失败。我知道我可以改用“统一缓冲区”,但似乎找不到将大型一维数组传递到带有缓冲区或其他方式的片段着色器的完整示例。谁能提供这样的例子? 最佳答案 这应该让您开始使用统一缓冲区对象来存储数组。注意GL要求UBO的最小容量为16KiB,最大容量可以通过GL_MAX_UNIFORM_BLOCK_SIZE查询。片段着色器示例(UBO需要Open

c++ - std::bind std::shared_ptr 参数不会增加 use_count

以下代码:#include#include#includestructFoo{Foo():m_p(std::make_shared()){}Foo(constFoo&foo){printf("copy\n");}std::shared_ptrm_p;};voidfunc(Foofoo){}intmain(){Foofoo;std::functionf=std::bind(func,foo);printf("usecount:%ld\n",foo.m_p.use_count());f();}得到结果:copycopyusecount:1copy由于复制了Foo,所以我认为m_p的use_

c++ - 如何避免每次构造或重置时都需要为 std::shared_ptr 指定删除器?

std::unique_ptr有两个模板参数,第二个是要使用的删除器。由于这一事实,我们可以很容易地为unique_ptr添加别名。到需要自定义删除器的类型(例如SDL_Texture),方式如下:usingSDL_TexturePtr=unique_ptr;...哪里SDL2PtrDeleter是一个用作删除器的仿函数。有了这个别名,程序员就可以构造和重置SDL_TexturePtr不关心甚至不知道自定义删除器:SDL_TexturePtrptexture(SDL_CreateTexture(/*args*/));//...ptexture.reset(SDL_CreateTextu

c++ - C++17 std::shared_mutex 还不可用吗?

查看C++compilersupport,看来std::shared_mutex的未计时版本在GCC5.0+中可用。但是,即使使用gccversion5.3.020151204(Ubuntu5.3.0-3ubuntu1~14.04),并用-std=c++1z编译,共享互斥体的简单初始化以:error:‘shared_mutex’innamespace‘std’doesnotnameatypestd::shared_mutexmutex_;不,我已经包含了正确的header:#include.它找不到正确的header,因为它似乎不存在。实际上,链接器使用位于/usr/include/c

c++ - union 中的 Shared_ptr

我想访问union的共享指针,尽管发生段错误:structunion_tmp{union_tmp(){}~union_tmp(){}union{inta;std::shared_ptr>ptr;};};intmain(){union_tmpb;std::shared_ptr>tmp(newstd::vector);b.ptr=tmp;//heresegmentationfaulthappensreturn0;}错误的原因是什么,我该如何避免? 最佳答案 您需要在union体中初始化std::shared_ptr:union_tmp(

C++11 make_shared 实例化

很抱歉这个问题太长了,但一些上下文是必要的。我有一些代码似乎对我正在从事的项目很有用:classFoo{public:Foo(intbar=1);~Foo();typedefstd::shared_ptrpointer_type;staticpointer_typemake(intbar=1){returnstd::make_shared(bar);}...}如您所见,它提供了一种将任何类构造为PointerType的直接方法,该类将shared_ptr封装到该类型:autooneFoo=Foo::make(2);因此,您无需在整个代码库中引用make_shared和shared_pt

c++ - 如何防止任何人窃取我的 shared_ptr?

因此,我使用boost::shared_ptr来获得它提供的所有各种引用计数优势——显然是初学者的引用计数,还有复制、分配并因此存储在STL容器中的能力。问题是,如果我只将它传递给一个“恶意”函数或对象,该对象可以保存ptr,然后如果外部函数或对象没有很好地放弃其所有权,我将永远无法取消分配它.最终,我尽量明确对象所有权。我通过让所有者保留对象的唯一shared_ptr来实现这一点,而“guest”对象仅将weak_ptr存储到对象。我真的不想要shared_ptr的“共享”部分,但我必须使用shared_ptr才能生成weak_ptr。我想使用scoped_ptr,但它非常有限,因为