我正在使用box2d(但这个问题可能只是关于c ++本身)并且有一个成员变量是指向void的指针,如下所示:
void* userData;
您可以通过getUserData()获取userData,它返回一个void指针。
我想将一个字符串存储为userData,并将userData设置为字符串,如下所示:
std::string user = "player";
playerDef.userData = &user;
然后我试图通过这样做来获取userData:
std::string* sd = (std::string*)bb->GetUserData();
(其中“bb”是指向持有这些信息的实体的指针)
最后,我尝试使用函数c_str()以获得与我的目的兼容的东西,但后来我得到错误: 访问冲突读取位置0x00000070
我也希望能够使用char数组做同样的事情,但我这样做:
char user[] = "player";
playerDef.userData = &user;
char* sd[] = (char*)bb->GetUserData();
第三步给出错误: 无法从'char '转换为'char * []'*
我已经可以通过在char部分看到这种方法出错,但我不知道是什么......
我用这样的整数做了同样的事情:
int user[] = int;
playerDef.userData = &user;
int* sd = (int*)bb->GetUserData();
这很有用。
所以我的问题如下:
注意:我非常乐意对可能的优化进行额外的考虑,例如用户static_cast等。
谢谢!非常感谢,非常喜欢!
干杯。
答案 0 :(得分:1)
std::string user = "player";
playerDef.userData = &user;
当此指针返回的任何函数设置返回时,user
对象std::string
将被销毁。在某个地方有指向此std::string
的指针的事实并没有改变它。
你后来使用这个指针的尝试失败了,因为很明显,字符串已被破坏,指针指向垃圾。
当你使用int
数组时,那也被打破了。在这种情况下,您的程序没有崩溃的事实并没有改变这是未定义的行为和错误。
这是将C ++代码与通用C库集成时的常见情况,C库对C ++类一无所知,它为您提供的所有内容都是一个不透明的,温和的void
指针。有几种方法可以正确地执行此操作。一种常见的方法是使用动态范围:
playerDef.userData = new std::string;
*playerDef.userData = "player";
稍后你可以取消引用这个指针,对指向的物体仍然存在有一定程度的信心,并且还没有从高轨道中被摧毁。
当然,现在您需要确保在某些时候这将获得delete
d,否则您将泄漏内存。但是,使用C库的不透明指针时,这通常是最好的。