好吧,这对我来说太麻烦了.我只是不知道这个任务有什么问题:
void *pa; void *pb;
char *ptemp; char *ptemp2;
ptemp = (char *)pa;
ptemp2 = (char *)pb;
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我为什么我收到此错误:
错误:从'void*'无效转换为'char*'
我正在使用Box2D(C++)并创建一个Objective-C对象并将其分配给Box2D正文的userData属性,该属性属于类型void*.
现在在某些情况下,它void* userData可能是该ObjC对象的唯一活动引用.因此,因为我(__bridge void*)在作业中使用过,所以ARC正在放手.这是我需要解决的问题.
我一直在思考防止这种情况发生的选择吗?我阅读了Clang的ARC文档,特别是关于桥梁铸造的部分(以及关于SO的Q&A)以及对他们认为"形成不良"的各种桥梁铸造结构的点头.
不过,我的第一个想法是(__bridge_retained void*)在初始分配给userData时使用.但这让我想知道如何平衡保留?我显然无法向对象发送释放.
那么我必须要CFRelease()对象吗?还是需要CFBridgingRelease()?或者在这里都是非法的?
是否(__bridge_transfer void*)从userData一个临时id类型转换为足够的,也许在之后将userData设置为NULL?这是一个好主意吗?
我所知道的替代办法是保留独立NSArray/ NSDictionary为userData对象,让他们在与Box2D的身体的寿命同步,添加和同步与他们的Box2D的身体移除它们.
但这感觉就像矫枉过正,因为在这里我知道我在做什么,我知道+1只要Box2D主体处于活动状态-1就需要对象,并且当Box2D主体被移除时我需要对象.另外我知道只有两种方法可以添加和删除Box2D主体,并且userData在我的框架中甚至无法直接访问,因为所有Box2D对象都隐藏在Objective-C接口/包装器后面.
暂时搁置"不良形式",你会建议我在这种情况下做什么?
我在Apple的一些示例代码中发现了这个构造,用于处理键值观察.添加观察者时,可以添加可以唯一标识KVO调用的上下文(以void*变量的形式) - 如果您希望多个KVO调用触发相同的操作,则特别有用,因为单个上下文可以避免使用一堆链式或语句来检查所有可能性.这是用于声明用于上下文的变量的行:
static void *aContext = &aContext;
Run Code Online (Sandbox Code Playgroud)
它基本上声明了一个引用自身的aContext,为自己分配了自己的内存位置 - 这是一个为KVO上下文创建唯一标识符的绝妙技巧.除了细节之外,我很好奇这究竟叫做什么(自我指定?圆形指针?还有什么?)以及除了KVO之外它还有什么用处.我尝试使用谷歌搜索不同的东西,但我无法想出任何完全相同的东西,缺乏适当的术语.:)
我肯定会定期使用这个技巧,因为它减少了KVO处理所需的if语句数量,这使得它更加优雅.
我想保持聪明的行为std::shared_ptr.那么有没有办法将共享的void指针转换为另一种类型而不会混淆引用计数?我无法获取原始指针并从中创建新的共享指针.
我有一些看起来像这样的代码:
template<typename T>
struct memory_block {
// Very not copiable, this class cannot move
memory_block(memory_block const&) = delete;
memory_block(memory_block const&&) = delete;
memory_block(memory_block&) = delete;
memory_block(memory_block&&) = delete;
memory_block& operator=(memory_block const&) = delete;
memory_block& operator=(memory_block&&) = delete;
// The only constructor construct the `data` member with args
template<typename... Args>
explicit memory_block(Args&&... args) noexcept :
data{std::forward<Args>(args)...} {}
T data;
};
template<typename T>
struct special_block : memory_block<T> {
using memory_block<T>::memory_block;
std::vector<double> special_data;
};
// There is no other inheritance. The hierarchy ends …Run Code Online (Sandbox Code Playgroud) 这是有效的
void *p = &X; /* some thing */
p += 12;
Run Code Online (Sandbox Code Playgroud)
如果是的话,p现在指向什么?我有(第三方)代码执行此操作(并编译干净)我的猜测是void*被视为char*.我信赖的K&R对此话题保持沉默(ish)
编辑:我的小测试应用程序在gcc 4.1.1上正常运行并将void*视为char*.但是g ++ barfs
我知道如何正确地做到这一点.我需要知道是否必须清理此代码库以找到它完成的所有位置.
BTW gcc -pedantic发出警告
摘要:
C规范含糊不清.它表示在表示和用作函数参数方面void*= char*.但它对指针算法没有提及.
Run Code Online (Sandbox Code Playgroud)... bool eqdc(B* b1, B *b2) { return dynamic_cast<void*>(b1) == dynamic_cast<void*>(b2); } ... int main() { DD *dd = new DD(); D1 *d1 = dynamic_cast<D1*>(dd); D2 *d2 = dynamic_cast<D2*>(dd); ... eqdc(d1, d2) ...
如果完全定义使用C++的行为(根据03或11个标准),以我想知道比较的(中)相等对两个空指针指向有效的,但不同的对象.
更一般地说,但可能不那么相关,是比较(==或!=)两个void*总是定义的类型的值,还是要求它们持有指向有效对象/存储区域的指针?
使用和提供什么固有的优势boost::any和boost::any_cast提供?void*dynamic_cast
如果我有以下代码:
int i = 5;
void * ptr = &i;
printf("%p", ptr);
Run Code Online (Sandbox Code Playgroud)
我会得到i或MSB的LSB地址吗?
平台之间的行为会有所不同吗?
C和C++之间有区别吗?
void*以这样的方式定义,它可以指向任何东西.那么它可以用来指向一个函数(int send())吗?
int send();
void* p = send;
Run Code Online (Sandbox Code Playgroud)
可能吗?当我这样使用时,它没有向我显示错误原因?如果没有,有没有办法将所有指针存储在一个变量中?
void-pointers ×10
c++ ×6
c ×5
casting ×2
objective-c ×2
pointers ×2
boost ×1
c++11 ×1
comparison ×1
shared-ptr ×1
variadic ×1