草庐IT

pointer-arithmetic

全部标签

c++ - auto_ptr 和 dynamic_pointer_cast

如果我想将dynamic_cast与shared_ptr一起使用,我可以使用dynamic_pointer_cast。如果我想转换auto_ptr,我该用什么?我假设如下所示。structB:A{};...auto_ptrbase(...);auto_ptrderive=dynamic_pointer_cast(base);我正在为shared_ptr使用boost 最佳答案 auto_ptrbase(...);if(B*query=dynamic_cast(base.get())){//takeownershipbase.rele

c++ - Xcode4 : "bad codegen, pointer diff" linker error again

这个问题与此相关:"badcodegen,pointerdiff"linkererrorwithXcode4和"badcodegen,pointerdiffinboost"errorin32-bitbuild和XCode3.2.6and4linkererrorsld:badcodegen,pointerdiffin...toglobalweaksymbol我目前正在将我的所有项目升级到Xcode4,但我遇到了一些奇怪的事情。-仅当我构建通用二进制文件或32位版本时才会出现上述错误。如果我只坚持64位,一切正常。我正在自己构建一个自定义静态库,现在我不在该代码中使用任何可见性设置(即at

c++ - 迭代中的指针算法是否溢出安全?

即使在较新的C++代码中,我也经常看到使用普通指针算法进行数组迭代。我想知道它们到底有多安全,使用它们是否是个好主意。考虑这个片段(如果你用calloc代替new,它也会在C中编译):int8_t*buffer=newint8_t[16];for(int8_t*p=buffer;p当buffer发生分配到地址0xFFFFFFF0时,这种迭代不会导致溢出并完全跳过循环吗(在32位地址空间中)或0xFFFFFFFFFFFFFFFF0(64位)?据我所知,这是一种非常不幸但仍有可能出现的情况。 最佳答案 这是安全的。C和C++标准明确允许

c++ - POINTER_32 - 它是什么,为什么?

我刚刚接到任务,将遗留应用程序从32位更新到64位。在审查任务的范围时,我在包含外部(例如平台)header之前立即发现了以下定义:#definePOINTER_32我找不到这个定义的用途或它有什么作用,但它看起来像是与我的任务直接相关的那种东西!它有什么用?它有什么用?立即移除它是否安全(我认为从长远来看有必要移除它)?这是使用MSVC++2008,即将成为2010。 最佳答案 这是一个通常在WindowsSDKheaderBaseTsd.hheader文件中声明的宏。在32位模式下编译时,它的定义如您所示。在64位模式下编译时定

c++ - 从其他容器中辨别 smart_pointer 的模板函数

考虑以下模板函数:templateconstT*DoSomething(constT&t){auto&id=typeid(T);coutT*DoSomething(T*t){auto&id=typeid(T);coutclasscontainer>T*DoSomething(constcontainer&t){auto&type_id=typeid(T);auto&container_id=typeid(container);coutclasscontainer,templateclassdeleter=default_delete>T*DoSomething(constcontain

c++ - int8_t 和 char : converts between pointers to integer types with different sign - but it doesn't

我正在处理一些嵌入式代码,并且正在从头开始编写一些新东西,因此我更愿意坚持使用uint8_t、int8_t等类型。然而,当移植一个函数时:voidfunctionName(char*data)到:voidfunctionName(int8_t*data)在将文字字符串传递给函数时,我收到编译器警告“在指向具有不同符号的整数类型的指针之间转换”。(即调用functionName("putthistextin");时)。现在,我明白了为什么会发生这种情况,并且这些行只是调试,但我想知道人们认为什么是最合适的处理方式,而不是对每个文字字符串进行类型转换。在实践中,我不认为一揽子类型转换比使用

c++ - 转置矩阵的内存黑客破坏堆栈,C++

我需要用C++实现一个矩阵转置过程。问题是签名,函数必须这样调用:transpose(in_mat[0][0],n,m,out_mat[0][0])其中n和m是维度。所有值都是double值,包括矩阵和维度。由于代码是自动生成的,我无法解决这个问题。我的解决方法是这样的:voidtranspose(double&in_mat,constdouble_n,constdouble_m,double&out_mat){intn=_n,m=_m;double*in_pointer=&in_mat;double*out_pointer=&out_mat;for(inti=0;i它工作正常。我用两

c++ - 数组指针的增量

我试图理解为什么以下C++代码无法编译intmain(){inta[10];int(*p)[10]=&a;int*q=static_cast(++p);}如果不是很明显,我尝试做的是使用指针算法找到指向数组末尾的指针。到目前为止,我的理解是p具有指向十个整数数组的类型指针,表达式++p也是如此。通常,我可以将一个int数组分配给一个指向int的指针类型的变量,但这在递增的指针++p上失败了。我第一次尝试不使用static_cast但那也没有用。 最佳答案 phastypepointertoarrayoftenints这是正确的。No

c++ - 当没有任何意义时, `Iterator::pointer` 使用什么?

例如,考虑一些假设的to_upper_iterator遍历一系列字符,返回std::toupper对于operator*.这些迭代器别名对我来说很有意义:templatestructto_upper_iterator{usingvalue_type=CharT;usingreference=CharT;usingdifference_type=std::ptrdiff_t;usingiterator_category=std::random_access_iterator_tag;};没有意义的是什么应该/可以用于pointer别名。我试着把它关掉,但果然我遇到了编译错误。似乎这是由于

c++ - 哪个更好 : Function overriding or passing a function pointer for event handling

因此,我正在为一个类编写代码,该类将进入一个供其他人使用的库。此类将拦截和处理传入的消息(细节并不重要,但它使用activemq-cpp库)。这个消费类的轮廓是classMessageConsumer{...public:voidrunConsumer();virtualvoidonMessage(constMessage*message);}其中runConsumer()建立连接并开始监听,并在收到消息时调用onMessage()。我的问题是:使用此代码的人将各自有自己的方式来处理不同的消息。我怎样才能保持MessageConsumer通用但提供这种灵active,同时保持代码简单?