c ++中某些类型转换的问题

时间:2017-02-27 22:42:07

标签: c++

我正在使用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();

这很有用。

所以我的问题如下:

  • 我对std :: string部分做错了什么?
  • char部分有什么问题以及如何实现char数组 我想要什么?
  • 那么整数部分如何工作呢:/(我知道它不是一个数组)?

注意:我非常乐意对可能的优化进行额外的考虑,例如用户static_cast等。

谢谢!非常感谢,非常喜欢!

干杯。

1 个答案:

答案 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库的不透明指针时,这通常是最好的。