无效存储双倍*

时间:2013-10-01 14:43:35

标签: objective-c++

我的函数在double中返回void *。但是它似乎松开了指针或似乎无法获取值,因为它在函数外返回0。

如何创建一个double并将其指定为void *的值,然后在不超出范围的情况下返回它。

这个函数的想法是它将一个对象从Objective-C转换为C ++中的某个东西,但C ++中的所有东西都不是像double这样的对象,它在Objective C中。

void * IDToSTD (id anObject){

void * stdObject = NULL;

if ([anObject class] == [PFObject class]) {
    stdObject = BridgePFObject((void *)CFBridgingRetain(anObject));
    return stdObject;
}

CFTypeRef inTypeRef = (__bridge CFTypeRef)anObject;
CFTypeID type = CFGetTypeID(inTypeRef);

if (type == CFArrayGetTypeID()) {
    std::vector<void *> arr = NSArrayToSTDVector([(NSArray *)anObject copy]);
    stdObject = &arr;
} else if (type == CFDictionaryGetTypeID()) {
    std::map<std::string, void *> dict = NSDictionaryToSTDMap([(NSDictionary *)anObject copy]);
    stdObject = &dict;
} else if (type == CFStringGetTypeID()) {
    stdObject = (char *)[(NSString *) anObject cStringUsingEncoding:NSUTF8StringEncoding];
} else if (type == CFNumberGetTypeID()) {
    double *value = (double *)malloc(sizeof(double *));
    *value = [(NSNumber *)anObject doubleValue];
    stdObject = value;
} else {
    [NSException raise:@"Invalid object value" format:@"Object must be of basic Core Foundation or Parse Type, Object Type is: %@", NSStringFromClass([anObject class])];
}

return stdObject;

}

1 个答案:

答案 0 :(得分:1)

我假设通过在void-pointer中加一个double,你的意思是:取双精度的地址,然后将双指针指向void指针。

直接将double赋给指针肯定会在32位应用程序中出现问题(double = 8字节,指针= 4字节)。

您可以做的是在函数中将double变量声明为static。然后返回指向该静态双变量的指针。但是,只要其他人(其他线程?)将调用该函数,静态double将被覆盖,第一个调用者将丢失该值。

线程问题可以通过使用线程本地存储来解决。在Visual Studio中,您可以使用“declspec(thread)”来生成静态变量static-per-thread。但是,如果你不能保证当第一个线程没有从void-pointer中获取double值时,同一个线程将调用相同的函数,这仍然无法解决问题。

您可以考虑将double引用作为参数传递给函数,然后将void-pointer返回给定的引用。这样,调用者提供了自己的double变量,然后函数填充并返回指向。

的指针