草庐IT

long_ptr

全部标签

c++ - 指针数组,如 (*(volatile unsigned long *)0x40004000)

我很难弄清楚如何解决以下问题。我在一个内存很少的嵌入式系统上,想尽量减少内存使用。指针总是让我感到困惑,而且将永远如此。我有一大堆寄存器地址的定义:#defineGPIO_PORTA_BASE(*((volatileunsignedlong*)0x40004000))#defineGPIO_PORTB_BASE(*((volatileunsignedlong*)0x40005000))//etc..这些寄存器可直接访问。例如:GPIO_PORT_BASE&=0x01;我需要的是一个包含上述寄存器的数组,以便我可以轻松地将它们映射到索引。例如:not_sure_what_to_decla

c++ - 如何将派生类的 shared_ptr vector 转换为基类的 shared_ptr vector

classInterface{};classClass:publicInterface{};classFoo{public:std::vector>&GetInterfaces(){return*(std::vector>*)(&m_data);//returnm_data;}private:std::vector>m_data;};这行得通,但又丑又吓人。有更好/更安全的方法吗?我不想做m_data类型std::vector>因为模块Foo完全属于Class作品的,Interface(和Foo::GetInterfaces())被实现为与一个单独的模块交互,该模块应该只知道Inter

c++ - 在 C++ 中创建 vector 的 shared_ptr

这个问题在这里已经有了答案:Callinginitializer_listconstructorviamake_unique/make_shared(2个答案)关闭6年前。在现代C++中,我们可以像这样初始化一个vector:std::vectorv={1,2,3,4,5};但是如果我尝试创建一个指向vector的智能指针,这将无法编译:autov=std::make_shared>({1,2,3,4,5});有没有比在创建后求助于push_back更好的选择?

c++ - 为什么 unique_ptr 析构函数的异常会终止程序?

看看这段代码,它导致程序在未捕获异常的情况下终止。#include#include#include#includeusingnamespacestd;structtest{~test()noexcept(false){throwruntime_error("-my-cool-exception-");}};intmain(){try{autoptr=unique_ptr(newtest());//testt;//thisisok,withoutunique_ptritworksfine.}catch(exception&e){cout这个问题不同于堆栈溢出问题:throwingexce

c++ - 使用 std::unique_ptr 将所有权转移到函数

我正在努力学习如何使用智能指针和理解所有权。当我按值将auto_ptr传递给函数时,该函数获得该指针的独占所有权。因此,当函数完成时,它会删除我传递给它的指针。但是,当我尝试使用unique_ptr执行此操作时出现编译错误,就好像unique_ptr的复制分配被禁用一样。通过引用传递unique_ptr似乎并没有转移所有权,它只是为函数提供了对unique_ptr的引用。如何通过将所有权传递给函数来获得auto_ptr的行为以使用unique_ptr?如果能提供有关unique_ptr的详细教程的链接,我将不胜感激,因为到目前为止,我读过的教程似乎只谈论auto_ptr或谈论Boost

c++ - 前向声明和 shared_ptr

我正在尝试重构我的代码,以便使用前向声明而不是包含大量header。我是新手,对boost::shared_ptr有疑问。假设我有以下界面:#ifndefI_STARTER_H_#defineI_STARTER_H_#includeclassIStarter{public:virtual~IStarter(){};virtualoperator()()=0;};typedefboost::shared_ptrIStarterPtr;#endif然后我在另一个类中有一个函数,它接受一个IStarterPtr对象作为参数,比如说:virtualvoidaddStarter(IStarter

c++ - std::remove_if 来自 std::vector 的多态 std::unique_ptr

我有一个包含三个类的层次结构,其中Derived源自Selectable和Drawable.然后我有一个std::vector的std::unique_ptr我用Derived填充对象。我确定该vector将仅由同时从两个基派生的对象填充。当我尝试使用指向Selected的指针从vector中删除某个元素时,问题就来了.#include#include#includestructSelectable{virtual~Selectable()=0;};Selectable::~Selectable()=default;structDrawable{virtual~Drawable()=0

c++ - 如何将 unique_ptr 的 vector 声明为类数据成员?

我想要一个unique_ptrvector作为我正在创建的类的成员。classFoo{[...]private:vector>barList;}但随后我开始收到来自VS2010编译器的神秘错误消息:errorC2248:'std::unique_ptr::operator=':cannotaccessprivatememberdeclaredinclass'std::unique_ptr'连同下面的一些错误行,这些错误行深入探讨了Microsoft对std::_Copy_impl的实现。...我把成员声明改成了vector>*barList;然后编译。但是我不禁想知道为什么我不能按照我

c++ - 使用 make_unique 语句重新分配 unique_ptr 对象 - 内存泄漏?

我不明白下面的语句会做什么(特别是第二行)?autobuff=std::make_unique(128);buff=std::make_unique(512);第二次调用make_unique后跟赋值运算符会释放第一次调用分配的内存,还是会发生内存泄漏?我必须使用buff.reset(newint[512]);吗?我调试了它,但没有发现任何operator=被调用,也没有发现任何析构函数被调用(通过unique_ptr)。 最佳答案 移动赋值运算符被调用,它执行if(this!=&_Right){//different,dothes

c++ - 当两者都是 32 位宽时,在 C(或 C++)中使用 `unsigned long` 和 `unsigned int` 是否存在可观察到的差异?

我正在使用带有编译器的MPC56XX(嵌入式系统),int和long都是32位宽。在一个必需的软件包中,我们对32位宽的类型有以下定义:typedefsignedintsint32;typedefunsignedintuint32;在新版本中,这在没有太多文档的情况下更改为:typedefsignedlongsint32;typedefunsignedlonguint32;我明白为什么这是一件好事:整数在short和long之间有一个转换等级,所以理论上在使用第一组时可以应用额外的转换定义。我的问题:考虑到包作者强加给我们的上述更改,是否存在可以想象的情况,这样的更改会更改已编译的代码